java对象的初始化顺序
经常看见初始化顺序这一块的题目,把这一部分整理成笔记加强记忆。
给定父类Parent和子类child通过输出,验证初始化顺序。
package dsh.java02.oob;
//父类
public class Parent {
static String s = get();
public Parent(){
System.out.println("parent构造方法");
}
{
System.out.println("parent构造代码块");
}
static {
System.out.println("parent静态代码块");
}
public static String get(){
System.out.println("parent -----初始静态成员变量");
return "1";
}
}
package dsh.java02.oob;
//子类
public class Child extends Parent {
static {
System.out.println("child 静态代码块");
}
static String s = get();
String a = get1();
public Child(){
System.out.println("child构造方法");
}
{
System.out.println("child构造代码块");
}
public static String get(){
System.out.println("child -----初始静态成员变量");
return "1";
}
public String get1(){
System.out.println("child -----初始成员变量");
return "1";
}
}
package dsh;
import dsh.java02.oob.Child;
import dsh.java02.oob.Parent;
//测试类
public class Test {
public static void main(String[] args) {
// Child.get();
// Parent parent = new Parent();
Child child = new Child();
}
}
new Child运行结果
parent -----初始静态成员变量
parent静态代码块
child 静态代码块
child -----初始静态成员变量
parent构造代码块
parent构造方法
child -----初始成员变量
child构造代码块
child构造方法
初始化顺序是:
1、加载类时会按照前后顺序加载静态成员变量和静态代码块。
2、加载子类时会先加载父类,再加载子类
3、初始化对象时 ,先加载类,再初始化成员变量,然后执行构造代码块,最后执行构造方法
4、new一个子类对象时,先加载父类—>加载子类—>初始化父类对象—>初始化子类对象