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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马李文 中级黑马   /  2013-5-28 09:42  /  1695 人查看  /  11 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马李文 于 2013-5-28 16:58 编辑

下面代码输出结果是多少呢~求解答~
  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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

11 个回复

倒序浏览
YXYZ 先构造父类的对象,父类里面的Y先被构造出来,打印y,然后父类的构造方法打印X。然后子类构造一个Y,打印Y,再打印子类的z!应该是这样

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
类Z是公共的,应该在Z.java的文件中声明
回复 使用道具 举报
画饼 发表于 2013-5-28 09:59
YXYZ 先构造父类的对象,父类里面的Y先被构造出来,打印y,然后父类的构造方法打印X。然后子类构造一个Y,打 ...

为什么先要把Y构造出来,而不先到X的构造方法,把Y b=new Y()放到构造函数下面还是这结果,我也凌乱了
回复 使用道具 举报
YXYZ。Z继承了X,因此先构造父类的对象,父类的对象b调用了Y的构造方法Y(),因此第一个打印出的是“Y”;然后父类本身的构造方法X()运行,因此再打印出“X”;父类中的完成后回到子类Z本身,Z中的对象y调用了Y()方法,因此接下来打印“Y”;最后是Z的构造方法,打印“Z”,至此程序结束。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
本帖最后由 lpflpy 于 2013-5-28 10:34 编辑


首先,在子类的构造方法(1)执行之前会先执行父类的构造方法,而父类中有变量和构造方法时,会先初始化变量(2,3),再执行构造函数(4).之后再初始化子类的变量(5,6),最后执行子类的构造函数(7);
  1. class X {
  2.         Y b = new Y();//-----2
  3.         X() {
  4.                         System.out.print("X");//-----4
  5.         }
  6. }

  7. class Y {
  8.         Y() {
  9.                         System.out.print("Y");//-----3/6
  10.         }
  11. }

  12. public class Z extends X {
  13.         Y y = new Y();//-----5
  14.         Z() {
  15.                         System.out.print("Z");//-----7
  16.         }

  17.         public static void main(String[] args) {
  18.                         new Z();//-----1
  19.         }
  20. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
lpflpy 发表于 2013-5-28 10:31
首先,在子类的构造方法(1)执行之前会先执行父类的构造方法,而父类中有变量和构造方法时,会先初始化变 ...

妹子就是比男人细腻,步骤列得杠杠的。{:3_57:}
回复 使用道具 举报
lpflpy 中级黑马 2013-5-28 10:49:40
8#
无妄无涯 发表于 2013-5-28 10:41
妹子就是比男人细腻,步骤列得杠杠的。

那是!哈哈
回复 使用道具 举报
我是那样想的,主函数先new Z();而Z继承了X,所以先到X中去初始化,X中的 Y b = new Y();
创建了Y的对象b所以要去Y中进行初始化打印Y,接着初始化完毕后回到X中初始化执行X的空参数构造函数,
执行完之后开始执行子类Z,Z中的Y y = new Y();又创建了Y的对象,于是又去Y中初始化调用空参数的构造函数打印Y,
最后才初始化Z调用构造函数打印Z。其实我也有点郁闷。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 赞一个!

查看全部评分

回复 使用道具 举报
无妄无涯 发表于 2013-5-28 10:41
妹子就是比男人细腻,步骤列得杠杠的。

妹子是抢分高手
回复 使用道具 举报
本题结果为YXYZ
这是创建对象时,各部分的加载情况,这是我通过编译代码总结出来的顺序,如果在单个独立的类中,如果创建这个类的对象,则加载顺序是静态成员---->静态代码块----->成员变量--->构造代码块----->构造函数,如果有此类继承与一个类,那么在创建此类对象的时候加载顺序是父类静态成员----->父类静态代码块----->子类静态成员----->子类静态代码块----->父类成员变量------->父类构造代码块------>父类构造函数----->子类成员变量------->子类构造代码块------>子类构造函数,有了这些加载顺序应该不成问题了吧。你要是不明白的话可以在回我我给你解释一下,我想应该没有解释的必要了吧,学语言就是多记就行,记多了不自然的就会了

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
父类静态代码块
父类构造代码块
父类构造函数


这三个怎么区分呢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马