一,类初始化过程
二,实例初始化过程
三,实际例子
/** * 类初始化: * 先初始化父类(Object) * 再初始化子类(Father) (5) (1) * * 子类实例初始化: * * 1>super()方法 * * 2>i = test() (9) * * 3>子类非静态代码 (3) * * 4>子类构造函数 (2) */ public class Father { private int i = test(); private static int j = method(); static { System.out.println("(1)"); } public Father (){ System.out.println("(2)"); } { System.out.println("(3)"); } //子类有重写这个方法,所以执行super时只会执行子类重写的方法 public int test(){ System.out.println("(4)"); return 1; } public static int method(){ System.out.println("(5)"); return 1; } }
/** * 类初始化: * 先初始化父类(Father) * 再初始化子类(Son) * * 子类初始化<clinit>(): * 1>j = method() (10) * 2>子类静态代码块 (6) * * 子类实例初始化: * 1>super()方法 * 2>i = test() (9) * 3>子类非静态代码 (8) * 4>子类构造函数 (7) */ public class Son extends Father { private int i = test(); private static int j = method(); static { System.out.println("(6)"); } public Son (){ System.out.println("(7)"); } { System.out.println("(8)"); } public int test(){ System.out.println("(9)"); return 1; } public static int method(){ System.out.println("(10)"); return 1; } public static void main(String[] args) { Son son1 = new Son(); System.out.println(); Son son2 = new Son(); } }
运行结果为:
(5) (1) (10) (6) (9) (3) (2) (9) (8) (7) (9) (3) (2) (9) (8) (7)
四,小结
执行顺序为:
1,父类类初始化-->父类静态变量和静态代码块-->子类初始化-->子类静态变量和静态代码块-->父类实例化-->父类的非静态属性和非静态代码块-->父类构造函数-->子类实例化-->子类的非静态属性和非静态代码块-->子类构造函数
2,静态属性和静态代码块只执行一次
复习:Java类初始化,实例初始化,构造函数,静态代码块,代码块等
原文:https://www.cnblogs.com/noperx/p/11316349.html