java对象实例化过程中的代码执行顺序
1、执行顺序
(1)父类静态的内容---->子类的静态的内容;
(2)初始化父类的成员变量初始化--->父类的非静态语句块--->父类的构造方法。
(3)初始化子类的成员变量初始化--->子类的非静态语句块--->执行子类的构造方法。
2、例证
(1)Base.java
public class Base{
public String whenAmISet = "set when declared in parent class";
Base() {
System.out.println("4 parent Constructor , it will invoke
preProcess() from child class.");
preProcess(); //调用子类的preProcess;
}
void preProcess() {}
//静态语句块
static {
System.out.println("1 parent static block ");
}
//非静态语句块
{
System.out.println("3 parent dynamic block , after
initialized filed from parent class,");
}
}
(2)Derived.java
public class Derived extends Base
{
public String whenAmISet = "set when declared";
@Override void preProcess()
{
whenAmISet = "set in preProcess()";
}
Derived() {
System.out.println("6 child constructor ");
}
static {
System.out.println("2 child static block");
}
{
System.out.println("5 child dynamic block , after
initialized filed from child class.");
}
}
(3)Main.java
public class Main
{
public static void main(String[] args)
{
Derived d = new Derived();
System.out.println( d.whenAmISet );
}
}
输出:
1 parent static block
2 child static block
3 parent dynamic block , after initialized filed from parent class,
4 parent Constructor , it will invoke preProcess() from child class.
5 child dynamic block , after initialized filed from child class.
6 child constructor
set when declared
提示:想观察执行顺序,可在eclipse选用debug模式,在每行代码输出处打断点观察执行顺序。
参考资料:
(1)Java 静态语句块、语句块、构造函数执行顺序
http://www.cnblogs.com/jycboy/p/5257615.html