1.Static关键字的用途
1.1 Static修饰成员变量
1.1.1 Static修饰成员变量的需求
当我们在代码中出现一个成员变量在我们每次创建不同的对象时,所赋值都一样,我们就可以把它放在一个公共区域内,不管几个对象都可以操作使用,而不在自己的对象保存数据,可以节约空间。
1.1.2 静态成员变量使用注意事项
1. 静态成员变量是使用static修饰的成员变量,定义在内存的数据区。
2. 静态成员变量不推荐使用类对象调用,会提示警告,使用static修饰的类内的成员变量,应该通过静态方式访问。
3. 静态成员变量使用类名调用是没有任何的问题。强烈推荐方式。
4. 在代码中没有创建对象时,可以通过类名直接使用静态成员变量,和对象无关。
5. 代码中对象已经被JVM的GC销毁时,依然可以通过类名调用静态成员变量,和对象无关。
6. 不管通过哪一种方式调用静态成员变量,修改对应的静态成员变量数据,所有使用到当前静态成员变量的位置,都会受到影响。
1.1.3 静态成员变量和对象无关
1. 从内存角度出发分析
静态成员变量是保存在内存的数据区
类对象占用的实际内存空间是在内存的堆区
这两个区域是完全不同的,所有可以说静态成员变量和对象没有关系 【没有对象】
2. 从静态成员变量以及类对象生命周期来分析
静态成员变量是随着类文件(.class) 字节码文件的加载过程中,直接定义在内存的数据 区。静态成员变量从程序运行开始就已经存在。
类对象是在代码的运行过程中,有可能被创建的。程序的运行过中,有可能会被JVM的CG垃圾回收机制销毁,程序在退出之前一定会销毁掉当前Java程序使用到的所有内存。
静态成员变量在程序退出之后,才会销毁
静态成员变量的生命周期是从程序开始,到程序结束
类对象只是从创建开始,而且随时有可能被JVM的GC销毁
生命周期不在同一个时间线上,所以静态成员变量和类对象无关,【没有对象】
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200216155405291.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDk0NTY1OA==,size_16,color_FFFFFF,t_70)
1.2 Static修饰成员方法
1.2.1 静态成员方法注意事项
1. 静态成员方法推荐使用静态方式调用,通过类名调用 【强烈推荐】
不推荐使用类对象调用,因为 【没有对象】
2. 静态成员方法中不能使用非静态成员 ==> (非静态成员方法和非静态成员变量)
因为 【没有对象】
3. 静态成员方法中不能使用this关键字
因为 【没有对象】
4. 静态成员方法中可以使用类内的其他静态成员 【难兄难弟】
5. 静态成员方法中可以通过new 构造方法创建对象
单身狗可以找对象
不能挖墙脚但是能自己找
1.2.2 静态成员方法特征解释
1. 静态成员方法加载时间问题
静态成员方法是随着.class字节码文件的加载而直接定义在内存的【方法区】,而且此时的静态成员方法已经可以直接运行。可以通过类名直接调用,而此时没有对象存在。 【没有对象】
2. 为什么静态成员方法不能使用非静态成员
非静态成员变量和非静态成员方法时需要类对象调用的,在静态成员方法中,是可以通过类名直接执行的,而此时是 【没有对象】
3. 为什么静态成员方法不能使用this关键字
this关键字表示的是调用当前方法的类对象,但是静态成员方法可以通过类名调用,this不能代表类名,同时也是 【没有对象】
4. 静态成员方法可以使用其他静态成员
生命周期一致,调用方式一致
1.3 类变量和类方法
类变量 == >静态成员变量
类方法 ==> 静态成员方法
类成员 ==> 静态成员变量和静态成员方法
1.4 静态代码块
static {
// 静态代码块
}
只要类文件加载,当前静态代码块中的内容就一定会执行,并且有且只执行一次。
整个类的初始化过程