打印的结果为什么会是"YXYZ"?
new Z()会调用Z的构造方法,第一行默认super语句指向了其父类的构造方法,所以先执行"x"在执行"Z".这个过程是怎么涉及到的Y的构造函数的?作者: 熊冠银 时间: 2013-3-11 20:39
第一个类的类名X写成小写了 望大家改一下在运行作者: 黑马17期-闫东东 时间: 2013-3-11 21:18
class X
解释:在main方法中创建Z类的实例,首先调用父类的构造函数,创建父类对象,
构造函数是创建对象的途径,在执行构造函数体之前先初始化对象的成员变量。
所以在创建父类对象的时,先执行父类对象的成员变量Y y = new Y();然后在执行构造体,执行完父类的构造体后,
执行Z类对象的成员变量,然后在执行Z类中的构造函数体。
所以打印的结果是YXYZ
我的理解是这样的, new Z(); 1,先去加载其父类 class X , 这其中就加载了class X 的成员 y ,调用了class Y的构造函数 打印Y
2,然后是class X的构造函数的覆盖,打印X
3,接着就到了class Z 了, 首先调用class Y 的构造函数,打印Y
4,最后就是执行了 class Z的构造函数,打印Z作者: 陈宇鹏 时间: 2013-3-11 22:08
class x
{
Y y=new Y();//这里优先加载进内存中
X()//这里是用来初始化X类的。
{
//这一行会有一个隐式的语句this()因为是父类,所以是执行本类构造函数
System.out.println("X");
}
}
class Y
{
Y()
{
System.out.prinltn("Y");
}
}
public class Z extends X
{
Y y=new Y();
Z()
{
System.out.println("Z");
}
public static void main(String args[])
{
new Z();//"Y X Y Z"
}
}
以下是我个人理解。
以下步骤是在运行时的过程
第一步,先执行了主函数中的new Z();
第二步,也就是创建了Z对象之后,因为继承,也就是说先会执行X类中的语句,因为new Y() 的优先级高于构造函数初始化,所以就先new 了对象,也就是说先执行了Y类中 的构造函数 输出了“Y”
第三步,才是执行X中的构造函数 X(),也就是输出了“X”
第四步,这时候才回到Z类,执行 Y y = new Y();这一步,与第二步同理,输出了“Y”
第五步,这时候才会执行Z的构造函数。也就是给Z初始化 输出了Z
最终结果,
Y X Y Z作者: 徐升2013 时间: 2013-3-11 22:11 本帖最后由 徐升2013 于 2013-3-11 22:29 编辑
【本题的结论】
这段代码用到的初始化过程主要是第5步:对属性进行显示初始化和第7步:对对象进行对应的构造函数初始化。
本题结果:Yy Y X Yy Z
下面结合结果分析这段代码中子类对象初始化的过程:
1、对静态属性进行初始化:
-》如果子类和父类中有静态变量的话,就先加载静态变量。(这段代码中就是先加载了子类中的static Y y=new YY();所以先打印Yy )
2、对父类中的非静态属性进行初始化:
-》如果没有静态变量或者加载完静态变量后,就会先加载父类中的非静态变量。
(这段代码加载过static Y y之后就加载了父类中的非静态变量 private Y y=new Y();所以打印了Y)
-》特别补充一点:即使父类中的非静态变量是私有的,也会被初始化加载。
3、对父类中进行构造函数初始化:(所以这段代码中接下来打印了X)
4、对子类中的属性进行初始化:(这段代码中接下来加载了子类中的非静态变量Y yy=new YY();所以打印了Yy)
5、对子类中进行构造函数初始化:(所以这段代码中接下来打印了Z)