黑马程序员技术交流社区

标题: 执行结果及解释? [打印本页]

作者: 京巨    时间: 2015-9-6 09:56
标题: 执行结果及解释?
请问这道题的执行结果,及解释?最重要的是解释啊!
  1. class X{
  2.         Y b = new Y();
  3.         X(){
  4.                 System.out.print("X");
  5.         }
  6. }
  7. class Y{
  8.         Y(){
  9.                 System.out.print("Y");
  10.         }
  11. }
  12. public class Z extends X{
  13.         Y y = new Y();
  14.         Z(){
  15.                 System.out.print("Z");
  16.         }
  17.         public static void main(String[] args){
  18.                 new Z();
  19.         }
  20. }
复制代码


作者: 史柯    时间: 2015-9-6 10:07
应该是这个答案
Y
Z
作者: 洋葱头头    时间: 2015-9-6 10:31
YXYZ  
作者: 曾宇    时间: 2015-9-6 10:38
先看主函数,主函数中只有一个new Z();
然后我们看类Z,Z继承了X,我们再来看X,X中有个new Y,我们再来看Y,Y中构造函数只有一句输出。输出Y,Y类结束,也就是说X类中的new Y语句执行完成,往下执行。有一个X类的构造函数,输出X。X类结束。相当于Z类的继承执行结束,往下运行,又一个new Y,执行new Y输出一个Y,new Y语句结束。执行Z类的构造函数,输出一个Z。
所以最后的输出结果是:YXYZ
作者: Ralap军    时间: 2015-9-6 10:51
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
如果有问题,还请指出!
作者: 京巨    时间: 2015-9-7 23:31
Ralap军 发表于 2015-9-6 10:51
new Z()
1、会先加载父类X的字节码文件,然后执行静态成员变量初始化和静态代码块(与顺序有关)
2、再加载 ...

谢谢啦,没有问题。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2