学习目标:
掌握Java中的静态资源的应用
学习内容:
1、static关键字的概念
static 关键字表示静态,可以修饰变量构成静态变量,修饰方法构成静态方法。静态变量和静态方法都归类所有,称为类的静态成员,用static关键字修饰。
- 静态变量
注意:静态变量会一直存在于内存空间中,不会被释放,但可以被置空,所以我们要尽量少用静态变量,因为非常耗资源。
定义语法:
static 数据类型 成员变量 [=初始值];
静态变量的访问:
类名.静态变量 (推荐写法)
对象/实例.静态变量
- 静态方法
static 也可以修饰方法称为静态方法,归类所有,也称类方法。语法:
[修饰符] static 返回值类型 方法名(形参列表){
}
静态方法访问方式:
类名.静态方法() (推荐)
对象.静态方法()
2、静态方法特性(重要)
[1] 静态方法中可以访问静态变量和类的其他静态方法
[2] 实例方法中可以访问静态成员(静态变量和静态方法);
[3] 静态方法不能访问实例成员
原因:
要明白上面问题的原因我们需要了解一下静态资源在JVM中的加载机制。首先我们运行Java程序:
1、是Class文件被加载到静态区
2、加载字节码,给静态变量分配内存
3、计算成员变量在未来new对象时需要的堆内存大小
4、加载方法,标记方法签名
问题解决:
也就是说静态变量在类初始化时就加载了,而非静态资源则是派生类(new)的时候才加载,静态资源早于非静态资源而存在,了解这个那么上面问题就很好解决了:
1、静态方法不能引用非静态资源(静态变量和方法),因为非静态资源是在类的派生后也就是实例化后才加载,而静态资源初始化阶段就一直存在,存在的静态资源当然访问不了一个不存在的资源。
2、静态方法可以引用静态资源(静态变量和方法),因为静态资源在类的初始化就存在,他们一同加载,自然可以访问。
3、非静态方法可以引用静态资源,因为非静态方法是在派生(实例化)后产生的,而静态资源早就已经存在了,非静态方法自然可以访问一个已经存在的静态资源。
JVM加载static成员的过程如下图:
总结:
以上就是Java中的静态变量的应用了,欢迎大佬指正错误。