日期:2014-05-20  浏览次数:20689 次

大家帮忙看一下运行结果
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();这句啊?
请赐教

------解决方案--------------------
这是涉及到初始化顺序的问题
他们的初始化顺序是这样的:
首先,Z是继承于X的,所以在初始化Z的构造器之前先要初始化X的构造器的!而成员变量应该先于构造器而被初始化(有static时另当别论),所以Y会先被执行.
接着,执行X的构造器,X被打印出来.
继续,到达类Z中,同理,先初始化成员y,所以又打印出一个Y.
最后,调用Z的构造器打印出Z!


Y在这些类的关系上是没有继承关系的,它只不过是被X和Z来用了一下而已,我想你是错在这里吧.
------解决方案--------------------
同上!
------解决方案--------------------
只要去实例化一个类时,才去调用构造函数。
加载类时,是按顺序的