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对象实例化顺序的主要内容,如果未能解决你的问题,请参考以下文章