1. 初始化父类中的静态成员变量和静态代码块 ;
2. 初始化子类中的静态成员变量和静态代码块 ;
3.初始化父类的普通成员变量和代码块,再执行父类的构造方法;
4.初始化子类的普通成员变量和代码块,再执行子类的构造方法;
上述说法个人觉得需要第4条需要特别注意下,子类的构造方法其实是最开始的new对象的时候就已经调用了,因为这时候会去寻找到底调用哪一个父类构造方法(默认无参),确认父类构造方法之后率先初始化父类的普通成员变量和代码块,然后执行父类的构造方法;随后程序会跳到子类普通成员变量和代码块处先初始化这部分,最后回到子类构造方法super()下的代码,代码执行不是连贯的。
class X{
Y y=new Y();
public X(){
System.out.print("X");
}
public X(String a){
System.out.print("A");
}
}
class Y{
public Y(){
System.out.print("Y");
}
}
class Z extends X{
Y y=new Y();
public Z(){
super("a");
System.out.print("Z");
}
public static void main(String[] args) {
new Z();
}
}
运行结果:
YAYZ