java对象初始化顺序
直接上测试吧:
Father.java
:
public class Father {
private static Property FatherStaticProp = new Property("调用Father的静态属性");
private Property FatherNonStaticProp = new Property("调用Father的非静态属性");
static {
System.out.println("调用Father静态代码块");
}
{
System.out.println("调用Father非静态代码块");
}
public Father(){
System.out.println("调用Father无参构造函数");
}
}
Son.java
:
public class Son extends Father {
private static Property sonStaticProp = new Property("调用Son的静态属性");
private Property SonNonStaticProp = new Property("调用Son的非静态属性");
{
System.out.println("调用Son非静态代码块");
}
static {
System.out.println("调用Son静态代码块");
}
public Son() {
System.out.println("调用Son无参构造函数");
}
}
辅助类Property.java
:
public class Property {
public Property(String echo) {
System.out.println(echo);
}
}
测试案例:
@Test
public void objInitTest(){
System.out.println("==========第一次实例化===========");
Son s0 = new Son();
System.out.println("==========第二次实例化===========");
Son s1 = new Son();
}
测试结果:
==========第一次实例化===========
调用Father的静态属性
调用Father静态代码块
调用Son的静态属性
调用Son静态代码块
调用Father的非静态属性
调用Father非静态代码块
调用Father无参构造函数
调用Son的非静态属性
调用Son非静态代码块
调用Son无参构造函数
==========第二次实例化===========
调用Father的非静态属性
调用Father非静态代码块
调用Father无参构造函数
调用Son的非静态属性
调用Son非静态代码块
调用Son无参构造函数
可以发现静态属性和静态代码块只初始化了一次,而静态属性和静态代码块的顺序根据代码中的顺序一样,哪个在前就先初始化哪一个;非静态属性和非静态代码块顺序的先后顺序也是哪个在前就先初始化哪个