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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周兴华 中级黑马   /  2012-8-19 19:50  /  2477 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

下面的代码我有点搞晕了,为什么运行结果是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();
}
}

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 新人提问,赞一个!

查看全部评分

6 个回复

正序浏览
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
回复 使用道具 举报
明白了,谢谢!
回复 使用道具 举报
希望你能够看明白

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

解释.jpg
回复 使用道具 举报
think  in java 4  第159页 是这样讲的
1:调用基类构造器。这个步骤会不断地重复递归下去,首先是构造这种层次结构的根,然后是下一层导出类,等等,直到最底层的导出类
2:按声明顺序调用成员的初始化方法。
3:调用导出类构造器的主题
回复 使用道具 举报

回复 使用道具 举报
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加载顺序,这段代码由于有父类,先加载父类的
实例变量,然后是父类的构造函数,接着是子类


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马