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();这句啊?
请赐教
{
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来用了一下而已,我想你是错在这里吧.
既然在初始化Z的时候先调用了Z中的Y y = new Y();
那为什么调用X的构造函数的时候后调用Y b = new Y();
你好,看来你还是没有理解我所说的,是我表达的不好吗?
我再解释一下,你问的那两句话都是在构造器之前就调用的,先初始化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();"
这个意思啊,不知道你是怎么理解的.