黑马程序员技术交流社区

标题: 关于继承的疑问 [打印本页]

作者: 周兴华    时间: 2012-8-19 19:50
标题: 关于继承的疑问
下面的代码我有点搞晕了,为什么运行结果是YXYZ呢?
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();
}
}
作者: 李杰    时间: 2012-8-19 20:22
class X {
Y b = new Y();            ---------1
X() {
   System.out.print("X"); ---------------2
}
}
class Y {
Y() {
   System.out.print("Y");
}
}
public class Z extends X {
Y y = new Y();       ----------------------3
Z() {
   System.out.print("Z");    ------------------------4
}
public static void main(String[] args) {
   new Z();
}
}
这个问题就看你了解java加载顺序,这段代码由于有父类,先加载父类的
实例变量,然后是父类的构造函数,接着是子类



作者: 贾林栋    时间: 2012-8-19 20:26


作者: 杨鹏鹏    时间: 2012-8-19 20:33
think  in java 4  第159页 是这样讲的
1:调用基类构造器。这个步骤会不断地重复递归下去,首先是构造这种层次结构的根,然后是下一层导出类,等等,直到最底层的导出类
2:按声明顺序调用成员的初始化方法。
3:调用导出类构造器的主题

作者: 杨彪    时间: 2012-8-19 21:01
希望你能够看明白

解释.jpg (97.33 KB, 下载次数: 26)

解释.jpg

作者: 周兴华    时间: 2012-8-19 22:30
明白了,谢谢!
作者: 黑马-李勇    时间: 2012-8-19 22:47
class X {                                                              3创建y
Y b = new Y();
X() {                                                                    5输出x
   System.out.print("X");
}
}
class Y {                                                               4输出Y   7 输出y
Y() {                                                                     
   System.out.print("Y");
}
}
public class Z extends X {                                     2 有父类x
Y y = new Y();                                                     6创建y
Z() {                                                                    8输出x
   System.out.print("Z");
}
public static void main(String[] args) {
   new Z();                                                               1创建一个z
}
}

前两天有一个人问了。
http://bbs.itheima.com/forum.php?mod=viewthread&tid=22629&page=1#pid132948




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