class X {

Y b = new Y();

X() {
System.out.println("X");
}
}

class Y {
Y() {
System.out.println("Y");
}
}



class Z extends X {
Y b = new Y();
Z() {
System.out.println("Z");
}
public static void main(String[] args) {

Z z=new Z();


}
}输出的结果是YXYZ
为什么会输出Y

解决方案 »

  1.   

    在new的时候,需要先对类的成员变量进行初始化。
    先执行main方法,执行到new Z()时,先对Z的成员变量初始化,而Z继承自X,因此先对X的成员变量进行初始化,然后才能调用X的构造。
    所以先对X类的成员变量b进行初始化,调用的Y的构造方法,打印Y,然后再调用X的构造方法打印X。
    接下来就是子类的成员变量b进行初始化,同理也要先调用Y的构造打印出Y,最后才调用Z的构造打印Z
      

  2.   

    Y b = new Y(); 
    这里b是一个成员变量,是Y类型的,初始化的时候必然调用Y的构造方法。
      

  3.   


    new的时候应该是先调用构造方法中的super()初始化父类,再初始化成员变量,最后再调构造方法中的其它东西。这个例子里边new Z(),先调super()初始化x,x中先初始化成员变量。再执行x().然后z初始化成员变量,再调z().