我有这样一程序,我测了他的运行过程,但是我不太理解为啥在调用他的构造函数之前要先调用他在构造函数外面的对象初始化了?public class X {
Y y = new Y();
X(){
System.out.println("X");
}
}
public class Y {
Y(){
System.out.println("Y");
}
}
public class Z extends X{

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

解决方案 »

  1.   

    你的Z是X的子类,那就有了X的属性和方法。你想问的就是为什么在用它的构造函数实例对象之前,先实例了一个Y的对象对吗?那是在实例化Z之后才进行的。在Z继承X以后,Z的实例的方法就成了这样:
    new Y();
    System.out.println("X");
    new Y();
    System.out.println("Z");所以结果是这样,这些都是在实例化z之后进行的,并不是在实例化z之前先运行的构造方法之外的。
      

  2.   

    我的意思就是验证执行顺序,主要问题是为啥在调用构造函数的时候,为啥不是先输出X,而是先new Y();谢谢大家的回答
      

  3.   

    不是一直都这样吗?看看下面的例子:
    public class Test4 {
    private int a;//等同于private int a = 0;
    Test4(int a) {
    this.a = a;//如果this.a还没定义又怎么能给它赋值呢?
    }
    }