class X {
Y b = new Y();
X() {
System.out.print("X");
}
}
class Y {
Y() {
System.out.print("Y");
}
}

public class Z extends X {
Y y = new Y();
Z() {
System.out.print("Z");
}


public static void main(String[] args) {
new Z(); 
}
}不理解为什么结果输出是YXYZ  ,求大神解答一下运行步骤

解决方案 »

  1.   

    要实例化子类,先会实例化父类,所以你实例化Z,先实例化X,
    1、调用X中的Y b = new Y();调用Y构造器输出Y
    2、调用X(),输出X
    3、调用Z中的Y y = new Y(); ,调用Y构造器输出Y
    4、调用Z(),输出Z
      

  2.   

    执行顺序:先super();再字段处初始化,再构造器下面的代码(即除super外的代码)。
      

  3.   

    z继承了x,所以z类可以看成
    public class Z  {
    Y b = new Y();
    ----------------------------------输出y
    X() {
    System.out.print("X");
    }
    ----------------------------------输出x
    Y y = new Y();
    ----------------------------------输出y
    Z() {
    System.out.print("Z");
    }
    ----------------------------------输出z
      

  4.   

    搞清楚继承的初始化顺序就很好理解了:
    创建z实例时,顺序:
    1:加载父类X,初始化成员y。(如有静态会优先静态)  。打印Y
    2:X构造器初始化。打印X
    3:加载Z类,初始化成员y,打印Y。
    4:Z类构造器初始化,打印Z。
    所以是YXYZ。记住初始化顺序是  
    静态~其他成员~构造器。
    有静态时情况特殊,建议你试一下就明白了。
    注:本人非
      

  5.   

    可以参考这篇blog, 里面详细讲了java初始化的顺序https://blog.csdn.net/zycxnanwang/article/details/77838046