static和final static的区别

这是Java一个类的生命周期,连接阶段包含:验证、准备、解析。
1:第一次赋值的内容不同
在准备阶段的工作:就是为类的静态变量分配内存并设为jvm默认的初值(对于非静态的变量,则不会为它们分配内存)。有一点需要注意,这时候,静态变量的初值为jvm默认的初值,而不是我们在程序中设定的初值。jvm默认的初值是这样的:
- 基本类型(int、long、short、char、byte、boolean、float、double)的默认值为0。
- 引用类型的默认值为null。
所以在准备阶段,只有static修饰的变量被赋值为JVM的初值,而final static修饰的常量被赋值为我们语句中写好的值!比如我们在程序中定义final static int a = 100,则准备阶段中a的初值就是100。
2:static有第二次赋值,final没有
在类的初始化阶段,会初始化与类相关的静态赋值语句和静态语句,也就是有static关键字修饰的信息,而没有static修饰的赋值语句和执行语句在实例化对象的时候才会运行。也就是说,在类的初始化的时候,会从父类到子类,依次执行static静态语句。
3:被使用,引起的效果不同
引用一个类的static静态字段,会引起这个类的初始化,而使用一个类的static final常量,不会引起类的初始化。
总结:static有两次赋值,static final只有一次/第一次赋值的内容不同/使用一个会引起类的初始化,另一个不会。
参考资料:https://blog.csdn.net/zhengzhb/article/details/7517213

浙公网安备 33010602011771号