———————————————–混混哥—————————————————- 类初始化的时机,有且仅有四个: 1、遇到new、getstatic、putstatic、invokestatic这四条字节码指令的时候。 2、使用Java.lang.reflect进行反射调用的时候。 3、当初始化一个类的时候,发现其父类还没有初始化,那么先去初始化它的父类。 4、当虚拟机启动的时候,需要初始化main函数所在的类。
———————————————-友谊哥———————————————– 说到这里,还要说下,静态变量和静态初始化块,普通变量、普通初始化块之间的初始化顺序。看这里 链接中说明了,静态变量和静态初始化块的声明顺序决定了初始化的顺序。 静态变量和静态初始化块的初始化时间::早于::普通变量和普通初始化块::早于::构造方法。 并不是完全父类初始化完毕之后,子类才开始初始化。实际上子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。
运行结果: 2.
public class Test03{ private int i1 = printCommon(); private static int i2 = printStatic(); public Test03(){ } public static int printCommon(){ System.out.println("i1 is init!"); return 1; } public static int printStatic(){ System.out.println("i2 is init!"); return 2; } public static void main(String[] args){ Test03 t = new Test03(); } }运行结果:
3. public class Test04{ private static Test04 t1 = new Test04(); private static int i1; private static int i2 = 2; public Test04(){ i1++; i2++; } public static void main(String[] args){ Test04 t2 = new Test04(); System.out.println("t2.i1 = " + t2.i1); System.out.println("t2.i2 = " + t2.i2); } }运行结果: 4. 在类初始化的时候,就规定了,静态语句块中只能访问到定义在静态语句块之前的变量,定义在它之后的,只能赋值,不能访问。
