Java对象实例化顺序

Posted liufengfan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 子类构造函数被调用...

顺序与开头说的完全一致

 

以上是关于Java对象实例化顺序的主要内容,如果未能解决你的问题,请参考以下文章

Java对象初始化顺序

java类的初始化块/执行顺序,实例化对象数据赋值

java类的加载顺序和实例化顺序(Demo程序)

Java实例化对象时的初始化

java对像实例化 静态块,静态对象执行顺序

java实例化