对象的初始化顺序:
(1)类加载之后,按从上到下(从父类到子类)执行被static修饰的语句(static字段和static语句块);
(2)main开始
(3)基类的成员对象构造函数或构造块(构造块可以看出成员对象以成员对象顺序构造);
(4)基类的构造函数
(5)派生类的成员对象构造函数或构造块
(6) 派生类的构造函数
(7)main结束
class C{
public C(){
System.out.println("A的成员对象c的构造函数");
}
}
class HelloA {
public HelloA() {
System.out.println("HelloA");
}
{ System.out.println("I'm A class"); }
C c=new C();
static { System.out.println("static A"); }
}
public class HelloB extends HelloA {
public HelloB() {
System.out.println("HelloB");
}
HelloA a=new HelloA();
{ System.out.println("I'm B class"); }
static { System.out.println("static B"); }
public static void main(String[] args){
System.out.println("-------main start-------");
new HelloB();
System.out.println("-------main end-------");
}
}
输出:
static A
static B
-------main start-------
I'm A class //构造块在成员对象c前
A的成员对象c的构造函数
HelloA
I'm A class
A的成员对象c的构造函数
HelloA
I'm B class //构造块在成员对象a之后
HelloB
-------main end-------