首页 > 代码库 > Java对象创建阶段的代码调用顺序

Java对象创建阶段的代码调用顺序

在创建阶段系统通过下面的几个步骤来完成对象的创建过程

  • 为对象分配存储空间
  • 开始构造对象
  • 从超类到子类对static成员进行初始化
  • 超类成员变量按顺序初始化,递归调用超类的构造方法
  • 子类成员变量按顺序初始化,子类构造方法调用

本文重点演示第三步到第五步:

Grandpa类

 1 package com.xinye.test; 2  3 public class Grandpa { 4     { 5         System.out.println("执行Grandpa的普通块"); 6     } 7     static { 8         System.out.println("执行Grandpa的静态快"); 9     }10     public Grandpa(){11         System.out.println("执行Parent的构造方法");12     }13     static{14         System.out.println("执行Grandpa的静态快222222");15     }16     {17         System.out.println("执行Grandpa的普通快222222");18     }19 }

Parent类

 1 package com.xinye.test; 2  3 public class Parent extends Grandpa{ 4     protected int a = 111; 5     { 6         System.out.println("执行Parent的普通块"); 7     } 8     static { 9         System.out.println("执行Parent的静态快");10     }11     public Parent(){12         System.out.println("执行Parent的构造方法");13     }14     public Parent(int a){15         this.a = a ;16         System.out.println("执行Parent的构造方法:InitParent(int a)");17     }18     static{19         System.out.println("执行Parent的静态快222222");20     }21     {22         System.out.println("执行Parent的普通快222222");23     }24 }

Child类

 1 package com.xinye.test; 2  3 public class Child extends Parent { 4     { 5         System.out.println("执行Child的普通块"); 6     } 7     static { 8         System.out.println("执行Child的静态快"); 9     }10     public Child(){11         super(222);12         System.out.println("a = " + a);13         System.out.println("执行Child的构造方法");14     }15     static{16         System.out.println("执行Child的静态快222222");17     }18     {19         System.out.println("执行Child的普通快222222");20     }21 }

测试类

 1 package com.xinye.test; 2  3 public class Test { 4  5     public static void main(String[] args) { 6         /** 7          *  8          *  第一步: 9          *      Grandpa如果有静态块,按照Grandpa的静态块声明顺序依次执行10          *      Parent中如果有静态块,按照Parent中的静态块声明顺序依次执行11          *      Child中如果有静态块,按照Child中的静态块声明顺序依次执行12          *  第二部:13          *      如果Grandpa中有普通块,按照Grandpa的普通块声明顺序依次执行14          *          执行完毕后,执行被调用的构造方法(如果Parent调用了Grandpa中的特定构造;如果没有则调用默认构造)15          *      如果Parent中有普通块,按照Parent的普通块的声明顺序依次执行16          *          执行完毕后,执行被调用的构造方法(如果Child调用了Parent的特定构造;如果没有则调用默认构造)17          *         如果Child中有普通块,按照Child的普通块的声明顺序依次执行18          *             执行完毕后,执行被客户端调用的特定构造方法19          */20         21         new Child();22     }23 }

执行结果

 1 执行Grandpa的静态快 2 执行Grandpa的静态快222222 3 执行Parent的静态快 4 执行Parent的静态快222222 5 执行Child的静态快 6 执行Child的静态快222222 7 执行Grandpa的普通块 8 执行Grandpa的普通快222222 9 执行Parent的构造方法10 执行Parent的普通块11 执行Parent的普通快22222212 执行Parent的构造方法:InitParent(int a)13 执行Child的普通块14 执行Child的普通快22222215 a = 22216 执行Child的构造方法