类的加载过程:
1.先加载类级别的成员(静态成员变量的方法 以及 静态初始化块,这两个打印的顺序依据出现的先后顺序)
2.再加载对象级别的成员(实例初始化块、普通成员变量的方法,打印的顺序依据出现的先后顺序)
3.构造函数
具体例子:
public class ObjectInitTest { public ObjectInitTest() { System.out.println("这是构造函数alta+Insert快捷键:ObjectInitTest()"); } //静态初始化块 static{ b=10; System.out.println("静态初始化块"); } //实例初始化块 对实例成员变量(依赖于对象) { System.out.println("instance init block"); } private int a=method1();//普通的成员变量,对象级别的 private static int b=method2();//静态的成员是共享的,类级别的 private int method1() { System.out.println("对象级别的method 1"); return 1; } private static int method2() { System.out.println("静态的,类级别的method 2"); return 2; } public static void main(String[] args) { /** * new ObjectInitTest() * 对象的产生过程 * 1. JVM会在ObjectInitTest.class文件 * 2. 先加载类级别的成员(静态成员变量的方法 以及 静态初始化块,这两个打印的顺序依据出现的先后顺序) * 3. 再加载对象级别的成员(实例初始化块、普通成员变量的方法,打印的顺序依据出现的先后顺序) * 4.构造函数 */ ObjectInitTest o=new ObjectInitTest(); } }
继承类同理: 静态>普通 基类>继承类
先打印基类的静态方法以及静态初始化块(根据出现的先后顺序),再打印子类的静态方法及静态初始化块(先后顺序)。
再打印基类普通的方法以及普通实例化块(先后),最后打印基类的构造函数;再打印子类的普通方法及普通实例化块(先后),最后打印子类的构造函数。
public class ObjectInitTest2 extends ObjectInitTest { private static int c=method3(); public static int method3(){ System.out.println("这是继承类的静态方法"); return 3; } static{ System.out.println("继承类的静态初始化块"); } private int d=method4(); public int method4(){ System.out.println("这是继承类的普通的成员方法"); return 4; } { System.out.println("继承类的普通实例化块"); } public ObjectInitTest2(){ System.out.println("继承类的构造方法"); } public static void main(String[] args) { ObjectInitTest2 o2=new ObjectInitTest2(); } }