Java对象实例化顺序

Java实例化顺序

1.初始化父类静态变量,如果没有赋值,默认初始化为null

2.调用父类 static{} 静态代码块

3.初始化子类静态变量

4.调用子类 static{} 静态代码块

5.初始化父类成员变量,如果没有赋值,默认初始化为null (此时this指针已经存在了)

6.调用父类 成员代码块 {}

7.调用父类构造函数(如果没有显示调用父类构造函数则调用默认构造函数)

8.初始化子类成员变量

9.调用子类成员代码块 {}

10.调用子类构造函数  

以上 1 - 4 步只有在类首次被加载的时候执行,之后就不执行了 

 

验证代码示例:

 1 public class Parent {
 2     // 成员变量
 3     private String parmemberVar = initParMemberVar();
 4     // 静态变量
 5     private static String parstaticVar = initParStaticVar();
 6 
 7     // 静态代码块
 8     static {
 9         System.out.println("父类静态代码块被调用...");
10     }
11 
12     // 成员代码块
13     {
14         System.out.println("父类成员代码块被调用...");
15     }
16 
17     // 构造函数
18     public Parent(){
19         System.out.println("父类构造函数被调用...");
20     }
21 
22     /**
23      *  初始化成员的方法, 输出一句话表示成员变量被初始化了
24      *  初始化成员变量的时候 this指针也已经创建了,也输出一下
25      */
26     public String initParMemberVar(){
27         System.out.println("父类成员变量初始化...");
28         return "initMemberVar";
29     }
30 
31     /**
32      *  初始化静态变量方法, 输出一句话表示静态变量被初始化了
33      */
34     public static String initParStaticVar(){
35         System.out.println("父类静态变量初始化...");
36         return "initstaticVar";
37     }
38 
39 }
 1 public class Child extends Parent{
 2     // 成员变量
 3     private String memberVar = initMemberVar();
 4     // 静态变量
 5     private static String staticVar = initStaticVar();
 6 
 7     // 静态代码块
 8     static {
 9         System.out.println("子类静态代码块被调用...");
10     }
11 
12     // 成员代码块
13     {
14         System.out.println("子类成员代码块被调用...");
15     }
16 
17     // 构造函数
18     public Child(){
19         System.out.println("子类构造函数被调用...");
20     }
21 
22     /**
23      *  初始化成员的方法, 输出一句话表示成员变量被初始化了
24      *  初始化成员变量的时候 this指针也已经创建了,也输出一下
25      */
26     public String initMemberVar(){
27         System.out.println("子类 this 指针: " + this);
28         System.out.println("子类成员变量初始化...");
29         return "initMemberVar";
30     }
31 
32     /**
33      *  初始化静态变量方法, 输出一句话表示静态变量被初始化了
34      */
35     public static String initStaticVar(){
36         System.out.println("子类静态变量初始化...");
37         return "initstaticVar";
38     }
39 
40     public static void main(String[] args) {
41         new Child();
42     }
43 }

验证输出结果:

 1 父类静态变量初始化...
 2 父类静态代码块被调用...
 3 子类静态变量初始化...
 4 子类静态代码块被调用...
 5 父类成员变量初始化...
 6 父类成员代码块被调用...
 7 父类构造函数被调用...
 8 子类 this 指针: Child@38cccef
 9 子类成员变量初始化...
10 子类成员代码块被调用...
11 子类构造函数被调用...

顺序与开头说的完全一致

 

posted @ 2020-03-02 13:40  liufengfan  阅读(625)  评论(1编辑  收藏  举报