A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 京巨 中级黑马   /  2015-9-6 09:56  /  490 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请问这道题的执行结果,及解释?最重要的是解释啊!
  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. }
复制代码

5 个回复

倒序浏览
应该是这个答案
Y
Z
回复 使用道具 举报
YXYZ  
回复 使用道具 举报
先看主函数,主函数中只有一个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
回复 使用道具 举报
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
如果有问题,还请指出!
回复 使用道具 举报
Ralap军 发表于 2015-9-6 10:51
new Z()
1、会先加载父类X的字节码文件,然后执行静态成员变量初始化和静态代码块(与顺序有关)
2、再加载 ...

谢谢啦,没有问题。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马