Java Object 构造方法的执行顺序
@author ixenos
为了使用类而做的准备工作包括三个步骤
1)加载:类加载器查找字节码(一般在classpath中找),从字节码创建一个Class对象
2)链接:验证字节码,为静态域(只是static修饰的域,不包含static final )分配存储空间,解析此类对其他类的所有引用
3)初始化:若该类有超类,对其初始化,执行静态初始化器和静态初始化块。
类初始化时构造方法执行顺序
对于某一个子类时:
(1)初始化对象的存储空间为零或null值;(子父类链接完毕,父类初始化完毕后)
(2)调用父类构造函数;无显式调用super(...)时,默认隐式调用super(),否则调用super(...)
(3)按顺序分别调用类成员变量(例如static int)和实例成员变量(例如int)的初始化表达式;
(4)调用本身构造函数。
1 public class Dollar extends Money{ 2 Rmb r=new Rmb(); 3 4 public Dollar(){ 5 6 System.out.println("Dollar is construct!"); 7 8 } 9 public static void main(String[] args){ 10 11 new Dollar(); 12 13 } 14 } 15 class Money{ 16 public Money(){ 17 System.out.println("Money is construct"); 18 } 19 } 20 class Rmb{ 21 public Rmb(){ 22 System.out.println("RMB is construct"); 23 } 24 } 25 26 27 /* 28 输出结果: 29 Money is construct 30 RMB is construct 31 Dollar is construct! 32 */
实例化某一个类的对象的时,块和构造器的相对运行顺序
(1)父类静态块
(2)子类静态块
(3)父类块
(4)父类构造器
(5)子类块
(6)子类构造器
1 public class Dog { 2 public Dog() { 3 System.out.println("Dog"); 4 } 5 static{ //静态块 6 System.out.println("super static block"); 7 } 8 { //普通块 9 System.out.println("super block"); 10 } 11 } 12 public class Mastiff extends Dog { 13 public Mastiff() { 14 System.out.println("Mastiff"); 15 } 16 { 17 System.out.println("block"); 18 } 19 static { 20 System.out.println("static block"); 21 } 22 public static void main(String[] args){ 23 Mastiff mastiff=new Mastiff(); //实例化一个对象 24 } 25 } 26 27 28 /* 29 输出结果: 30 super static block 31 static block 32 super block 33 Dog 34 block 35 Mastiff 36 */