面试准备3:Java中静态(static)成员何时才会初始化
2018-07-30 本文已影响0人
shaYanL
静态成员有哪些?static修饰的成员变量即:类变量
静态成员的初始化的阶段,根据有没有显示初始化而异,根据是否被final修饰而异:
private static int num = 11;
private static int num2;
private static final int num3 = 12
在类加载的准备阶段会给所有static 成员在方法区中分配内存,并设置变量初始值【这个初始值就是零值,零值根据类型不同而异】,所以可以理解为num2就是默认初始化为了0,因为它没有显示初始化,之后不会再初始化num2的值了;
这时【即准备阶段】num值也为0,在类加载的初始化阶段num才会执行类变量赋值的操作,即在初始化阶段num值为11;
但在类加载的准备阶段num3的值就会被赋值为12而不是0,这是因为num3被final修饰,此时“类字段的字段属性表中就存在ConstantValue属性,而准备阶段变量num3就会被初始化为ConstantValue属性所指定的值”--来自《深入理解Java虚拟机》第二版
总结
所有静态成员在类加载完成之后都已经或显示或隐式的完成了初始化赋值的操作。
下面是各个类型的零值
零值:
int 0
long 0L
short (short) 0
char '\u0000'
byte (byte) 0
boolean false
float 0.0f
double 0.0d
引用类型 null
关于static的一些使用分析见 谈static