黑马程序员技术交流社区
标题:
执行结果及解释?
[打印本页]
作者:
京巨
时间:
2015-9-6 09:56
标题:
执行结果及解释?
请问这道题的执行结果,及解释?最重要的是解释啊!
class X{
Y b = new Y();
X(){
System.out.print("X");
}
}
class Y{
Y(){
System.out.print("Y");
}
}
public class Z extends X{
Y y = new Y();
Z(){
System.out.print("Z");
}
public static void main(String[] args){
new Z();
}
}
复制代码
作者:
史柯
时间:
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