new Z()
1、会先加载父类X的字节码文件,然后执行静态成员变量初始化和静态代码块(与顺序有关)
2、再加载本类Z的字节码文件(因为main函数在本类中,jvm第一个加载的就是类Z的字节码文件)
3、开辟堆空间(本类Z的对象),定义本类Z的成员变量,并赋系统默认值,然后加载方法到方法区
4、再开辟一个堆空间(父类X的内存空间标识,不是对象),定义父类X的成员变量,并赋系统默认值,然后把方法加载到方法区
5、对父类X的成员变量进行显式初始化,即b = new Y(),将打印Y
6、执行父类X的构造代码块和构造方法,将打印X
7、把父类的内存空间标识赋给子类Z
8、对本类Z的成员变量进行显式初始化,即y = new Y(),将打印Y
9、执行本类Z的构造代码块和构造方法,将打印Z
10、因为是匿名对象,所以无栈内存变量接收本类Z对象的地址值
结果为:YXYZ
如果有问题,还请指出! |