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();
        }
}
这段代码我认为是YYXZ,但是我编译 运行了一下结果是YXYZ请问为什么?
我错在哪 了?
X的构造函数在被调用的时候应给首先调用Y b = new Y();这句啊?
请赐教

解决方案 »

  1.   

    这是涉及到初始化顺序的问题
      他们的初始化顺序是这样的:
      首先,Z是继承于X的,所以在初始化Z的构造器之前先要初始化X的构造器的!而成员变量应该先于构造器而被初始化(有static时另当别论),所以Y会先被执行.
      接着,执行X的构造器,X被打印出来.
      继续,到达类Z中,同理,先初始化成员y,所以又打印出一个Y.
      最后,调用Z的构造器打印出Z!
      Y在这些类的关系上是没有继承关系的,它只不过是被X和Z来用了一下而已,我想你是错在这里吧.
      

  2.   

    hsc045605() 你好,看了你说我就更糊涂了
    既然在初始化Z的时候先调用了Z中的Y y = new Y();
    那为什么调用X的构造函数的时候后调用Y b = new Y();
      

  3.   

    tedaugust2002(泰德) 
      你好,看来你还是没有理解我所说的,是我表达的不好吗?
    我再解释一下,你问的那两句话都是在构造器之前就调用的,先初始化X类,在X类中先调用Y b = new Y();所以就打印了一个Y.
      紧接着,初始化X构造器,打印出X.
      再接着,初始化Z类,在Z类中,也是先调用Y y = new Y();先打印出一个Y
      最后才初始化Z的构造器,打印出Z.  不知道现在我说明白了没有?
      我只是重新解释了一下,不过之前所说的话里也没有
                        "既然在初始化Z的时候先调用了Z中的Y y = new Y();
                        那为什么调用X的构造函数的时候后调用Y b = new Y();"
    这个意思啊,不知道你是怎么理解的.