JVM

从class文件与JVM加载机制理解final、static、s

2021-02-20  本文已影响0人  三也视界

编程过程中经常用的static,final关键字,JVM中class类文件结构可以找到答案。

ConstantValue属性

ConstantValue属性的作用是通知虚拟机自动为静态变量赋值,只有被static修饰的变量才可以使用这项属性。非static类型的变量的赋值是在实例构造器方法中进行的;static类型变量赋值分两种,在类构造器中赋值,或使用ConstantValue属性赋值。

在实际的程序中,只有同时被final和static修饰的字段才有ConstantValue属性,且限于基本类型和String。编译时Javac将会为该常量生成ConstantValue属性,在类加载的准备阶段虚拟机便会根据ConstantValue为常量设置相应的值,如果该变量没有被final修饰,或者并非基本类型及字符串,则选择在类构造器中进行初始化。

1.为什么ConstantValue的属性值只限于基本类型和String?

因为从常量池中只能引用到基本类型和String类型的字面量

2.final、static、static final修饰的字段赋值的区别?

在一个类中定义字段时,可以声明为成员变量(如final),也可以声明为类变量(静态变量),静态变量在装载类时被初始化,而成员变量每次创建实例时都会被初始化一次。一个字段被声明为static final,表示这个字段在初始化完成后就不可再改变了,final,类的初始化完成后,在类的实例化进行赋值,每次实例化的值不一定相同。加上了static 的 final,在类只装载一次的情况下,可以是真正意义的“常量”
例如:

private static final int random = new Random().nestInt();//每次发生类装载时都会赋值一次,且赋的值都不一样 
private final int random = new Random().nestInt();//每次生成这个类的实例时都会赋值一次,且赋的值都不一样
上一篇下一篇

猜你喜欢

热点阅读