对象的初始化顺序
2017-12-16 本文已影响10人
SHAN某人
分析代码来源:胖胖-对象初始化顺序
/**
* 控制台打印
*/
class Log{
public static String baseFieldInit(){System.out.println("父类非静态变量");return "";}
public static String baseStaticFieldInit(){System.out.println("父类静态变量");return "";}
public static String fieldInit(){System.out.println("子类非静态变量");return "";}
public static String staticFieldInit(){System.out.println("子类静态变量");return "";}
}
/**
* 基类
*/
class Base {
/*1*/ private static String staticValue=Log.baseStaticFieldInit();
/*1*/ static {System.out.println("父类静态代码块");}
/*1*/ static {System.out.println("父类静态代码块2");}
/*3*/ {System.out.println("父类非静态代码块1");}
/*3*/ private String value=Log.baseFieldInit();
/*3*/ {System.out.println("父类非静态代码块2");}
/*4*/ Base(){System.out.println("父类构造方法");}
}
/**
* 派生类
*/
public class Derived extends Base{
/*2*/ static {System.out.println("子类静态代码块1");}
/*2*/ private static String staticValue=Log.staticFieldInit();
/*2*/ static {System.out.println("子类静态代码块2");}
/*5*/ {System.out.println("子类非静态代码块1");}
/*5*/ private String value=Log.fieldInit();
/*5*/ {System.out.println("子类非静态代码块2");}
/*6*/ Derived(){System.out.println("子类构造方法");}
/**
* MAIN 主线程
*/
public static void main(String[] args){
Derived d=new Derived();
}
}
执行结果
结论:
一个误解首先指出初始化顺序不一定严格按照以上顺序进行,如果静态代码块写在静态变量之前,则先执行静态代码块。
总之,规律是执行的顺序严格按照先静态再非静态再构造方法,先父类后子类的顺序进行。