java 继承问题 :输出YXYZ

class X{
    public Y y = new Y();

    public X(){
        System.out.println("X");
    }
}
class Y{
    public Y(){
        System.out.println("Y");
    }
}
public class Z extends X{
    public Y y = new Y();

    public Z(){
        System.out.println("Z");
    }

    public static void main(String[] args) {
        new Z();
    }
}
------------------------------------------
执行结果:
Y
X
Y
Z

知识补充:

    new Z()这种形式,表示new出一个对象的地址没地方保存,待这行语句执行完毕之后,就立刻会被垃圾回收机制判定为垃圾随之被回收; 创建子类实例的时候,会先构造父类的实例(调用父类的构造方法); 初始化顺序:就地初始化、代码块并列执行(谁在前谁先执行)最后执行构造方法; 代码块执行顺序:static修饰的代码块(类加载时执行)执行始终在普通代码块(创建实例时)之前,类加载只执行一次。

过程分析:

    new Z()的时候,会先构造父类的实例,进入X中执行 构造X实例的时候,先就地初始化,再调用构造方法,于是进入Y执行 进入Y,执行Y的构造方法,打印了Y 执行完Y后,出来执行X的构造方法,打印了X 此时父类X已经准备就绪,开始执行子类Z的初始化 对于Z来说也是先执行就地初始化,再调用构造方法 就地初始化时进入Y执行,只调用了构造方法,打印了Y 接下来执行自己的构造方法,打印了Z 故结果为输出YXYZ
经验分享 程序员 微信小程序 职场和发展