标签:
一、初始化顺序
无继承:静态变量、静态初始化块 > 变量、初始化块 > 构造函数
有继承:静态变量、静态初始化块 > 父类初始化 > 子类初始化
同一级别,按出现的顺序依次进行初始化。
package initialization; public class Insect { public String field0 = this.InitField("Insect:变量0"); public static String staticField0 = StaticField("Insect:静态变量0"); public String field1 = this.InitField("Insect:变量1"); static { System.out.println("Insect:静态出初始化块"); } public String field2 = this.InitField("Insect:变量2"); { System.out.println("Insect:初始化块"); } public String field3 = this.InitField("Insect:变量3"); Insect(){ System.out.println("Insect:构造函数"); } public String field4 = this.InitField("Insect:变量4"); public static String staticField1 = StaticField("Insect:静态变量1"); public static String StaticField(String s){ System.out.println(s); return " "; } public String InitField(String s){ System.out.println(s); return " "; } }
package initialization; public class Beetle extends Insect { static { System.out.println("Beetle:静态出初始化块"); } { System.out.println("Beetle:初始化块"); } Beetle() { System.out.println("Beetle:构造函数"); } }
package initialization; public class Test { public static void main(String[] args){ /* *测试无继承,初始化顺序 */ //Insect insect = new Insect(); /* * 测试继承,初始化顺序 */ //Beetle beetle = new Beetle(); } }
二、类的初始化(JVM)
a、加载:将字节码二进制.class文件加载到内存。
b、连接
1.验证:验证内存中字节码是否符合jvm规范。
2.准备:为类的静态变量分配内存,并初始化默认值。
3.解析:把类的符号引用转为直接引用
c、初始化:将类的静态变量赋予定义的初始值,非默认值。
三、类的初始化步骤
a、如果该类没有被加载和连接,那首先进行加载及连接。
b、如果该类存在直接父类,且父类未被初始化,那先对其直接父类进行初始化。
c、如果该类存在初始化语句,那依次执行这些初始化语句。
PS:静态变量及静态初始化块都可被看作是类的初始化语句。
四、类的主动使用与被动使用
主动使用:
1.创建类的实例
2.访问某个类或接口的静态变量,或为该静态变量赋值
3.调用类的静态方法
4.反射
5.初始化一个类的子类
6.jvm启动时,被标明为启动类的类
被动使用:其它使用java类的方式,不会导致类的初始化。
例,使用ClassLoader加载一个类,并不是对类的主动使用,不会导致类的初始化。
package initialization; public class ClassLoaderInitTest { public static void main(String[] args) { ClassLoader loader = ClassLoader.getSystemClassLoader(); try { @SuppressWarnings("unused") Class<?> cl = loader.loadClass("initialization.CL"); System.out.println("**********************************"); cl = Class.forName("initialization.CL"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } class CL { static { System.out.println("CL:init"); } }
标签:
原文地址:http://www.cnblogs.com/wscy/p/4790003.html