解释:在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
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