java static关键字的使用
static关键字
通常来说,创建类的时候,是用new创建此类的对象才可以获得,执行new创建对象时数据存储空间才被分配,其方法才被外界调用
有两种情况用new无法解决:
1)只为某特定域分配单一存储空间,不管创建多少对象
2)希望某个方法不与包含她的类的任何对象实例关联在一起
static初始化:
无论创建多少个对象,静态数据都只占用一份存储区域。static关键字不能用于局部变量,只能作用于域。
如果一个域是静态的基本类型域并且没有进行初始化,那就会获得基本类型的标准初值;如果是一个对象的引用,那么默认初始化值是null
类加载顺序:先加载static域,而后是非static域
类加载后,类中的static域在之后的new中将不再初始化,而非static域会再次被初始化
static用法:
随着类的加载而加载,优先于对象出现在内存中,并且不能以任何方式引用this 或super
1.修饰变量。静态字段
静态变量的定义规范:一旦被static修饰的变量,变量名称建议全部大写
当一个类中某个变量被所有对象共享,那么可以将该变量定义为静态变量.静态字段可以直接使用类名调用该方法
public class StaticTest01{
public static void main(String[] args){
//PI可以对所有对象共享
CArea c1 = new CArea(10);
CArea c2 = new CArea(100);
double area1 = c1.area();
double area2 = c2.area();
System.out.println("两个圆的面积分别为:"+area1+"~"+area2);
System.out.println("圆周率:"+CArea.PI);
System.out.println("圆周率:"+c1.PI+"~"+c2.PI);
}
}
class CArea{
public int r;
public static double PI = 3.14; //圆周率
public CArea(){}
public CArea(int r){
this.r = r;
}
public double area(){
return PI*r*r;
}
}
/*
结果:
314~31400
3.14
3.14~3.14
*/
以上程序,创建了两个CArea对象,这两个对象c1,c2共享一个PI,c1.PI和c2.PI值相同一存储空间,具有相同的值3.14
引用static变量的两种方式:1)如c1.PI; 2)实用类名直接调用:CArea.PI
总结:static作用于某字段时会改变数据创建的方式:因为static字段对每个类来说,无论这个类创建多少个实例,都只有一份存储空间(存储在方法区被所有本类的对象共享),而非静态字段是对每个对象来说都有一份存储空间
2.修饰方法
方法一旦被static修饰,就可以直接使用类名调用该方法
一般将工具类的方法(不需要使用成员变量)定义为static,直接通过类名去调用
静态不能调用非静态,非静态可以调用静态和非静态
public class StaticTest02{
public static void main(String[] args){
double area = CArea.area(10); //通过类名CArea去调用静态方法area
System.out.println("圆的面积:"+area);
}
}
class CArea{
public int a; //非静态变量
public static double PI = 3.14; //圆周率
public CArea(){}
public static double area(int r){ //静态方法
//a = 10; //错误做法。
return PI*r*r;
}
}
以上程序,在静态方法area中调用非静态成员变量a是错误做法!!!静态不能调用非静态
static方法的一个重要用法是不创建任何对象的前提下可以直接调用此方法
3.静态代码块
static{语句;} 随着类的加载而加载,加载类时直接运行静态代码块
static代码块只执行一次:当首次生成这个类的一个对象时,或者首次访问数据这个类的静态数据成员时(即便从未生成这个类的对象)
4.修饰类
通常一个普通类不允许被声明为static的,有一个特殊情况:内部类可以被声明为static
当一个内部类被声明为static时,外部类可以直接调用内部类,因为static的内部类是在加载外部类的同时加载的,所以只要实例化外部类后,就能用外部类对象直接调用 静态内部类,而无需实例化内部类。
java static关键字的使用的更多相关文章
- Java Static关键字详解
提起static关键字,相信大家绝对不会陌生,但是,想要完全说明白,猛的一想,发现自己好像又说不太明白... ...比方说,昨天被一个同学问起的时候... ... 当然,不是所有人都像我一样学艺不精的 ...
- java static关键字
方便在没有创建对象的情况下来进行调用(方法/变量). 很显然,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问. static可以用来修饰类的 ...
- Java static 关键字详解
引言 在<Java编程思想>中有这样一段话:static方法就是没有this的方法.在static方法内部不能调用非静态方法,反过来是可以的.而且可以在没有创建任何对象的前提下,仅仅通过类 ...
- 【转载】java static 关键字的四种用法
原文链接点这里,感谢博主分享 在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构 ...
- [java]static关键字的四种用法
在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们先来了解一下stat ...
- Java——static关键字
前言 static关键字算是Java中比较复杂的关键字之一,它可以修饰变量.方法.类以及代码块.下面将介绍static的具体使用. static引入的目的 static的作用 static修饰变量 s ...
- Java——static关键字---18.09.27
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但在Java语言中没有全局变量的概念. static关键字主要有两种作用: 一.为某特定数据类 ...
- Java static关键字的重新思考
上完Java课,虽然也写了不少的Java代码,但是一直有不少的疑惑,而static关键字一直困惑着我很久,今天无意探究竟,上知乎再仔细查了一下,发现了这个话题的优秀答案https://www.zhih ...
- java static关键字和代码块
static关键字 代码块 方法重写 1. 方法重写的特点: 2. 注意事项: static关键字 为什么需要学习static关键字? 针对某一个变量属于类而不属于某一个具体的对象的时候,我们可以考虑 ...
随机推荐
- unittest同时支持参数化和生成html报告
最近在用python3.6+unittest+requests做自动化接口测试.发现一个问题,unittest中使用第3方插件parameterized进行参数化,再生成html报告时,运行就会失败. ...
- React Native图片缓存解决方案
1. react-native-fetch-blob 将图片存在本地的一个东西 2. react-native-img-cache 自动缓存的一个东西 上面装好后 就可以使用啦 import {Cac ...
- 201806 数据处理 SQL、python、shell 哪家强...速度PK(上篇)
最近在工作中,进行大量的数据处理,使用的是mysql5.7.22,发现当数据量级达到几十万之后,SQL执行速度明显变慢.尤其是当多个表join时,于是就尝试用python pandas进行数据处理,发 ...
- 解决ubuntu无法使用root用户启动Google Chrome浏览器
1.找到Chrome的路径 # whereis google-chrome google-chrome: /usr/bin/google-chrome /usr/share/man/man1/goog ...
- ORM的概念
- 在webstorm中配置sass的自动编译,并且可以指定编译后的css的目录.
参考: WebStorm-2018.2-Help-Sass, Less, and SCSS 作者:tobyDing链接:https://www.jianshu.com/p/0fe52f149cab來源 ...
- git pull 撤销误操作
本来想把github上的release合并到本地的release分支上,由于没有查看当前分支,直接运用git pull origin v2.8.1,结果将release合并到了v2.8.1分支中. 解 ...
- 【sock_stream和sock_dgram】、 【AF_INET和AF_UNIX】
[sock_stream和sock_dgram] 1.sock_stream 是有保障的(即能保证数据正确传送到对方)面向连接的SOCKET,多用于资料(如文件)传送. 2.sock_dgram 是无 ...
- LeetCode--035--搜索插入位置(java)
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 输入: [1,3,5,6], 5 输 ...
- nginx日志相关运维操作记录
在分析服务器运行情况和业务数据时,nginx日志是非常可靠的数据来源,而掌握常用的nginx日志分析命令的应用技巧则有着事半功倍的作用,可以快速进行定位和统计. 1)Nginx日志的标准格式(可参考: ...