黑马程序员技术交流社区

标题: 这个程序怎么运行的 结果是多少呢~ [打印本页]

作者: 黑马李文    时间: 2013-5-28 09:42
标题: 这个程序怎么运行的 结果是多少呢~
本帖最后由 黑马李文 于 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. }
复制代码

作者: 画饼    时间: 2013-5-28 09:59
YXYZ 先构造父类的对象,父类里面的Y先被构造出来,打印y,然后父类的构造方法打印X。然后子类构造一个Y,打印Y,再打印子类的z!应该是这样
作者: HM张博文    时间: 2013-5-28 10:03
类Z是公共的,应该在Z.java的文件中声明
作者: 金辉    时间: 2013-5-28 10:19
画饼 发表于 2013-5-28 09:59
YXYZ 先构造父类的对象,父类里面的Y先被构造出来,打印y,然后父类的构造方法打印X。然后子类构造一个Y,打 ...

为什么先要把Y构造出来,而不先到X的构造方法,把Y b=new Y()放到构造函数下面还是这结果,我也凌乱了
作者: 无妄无涯    时间: 2013-5-28 10:29
YXYZ。Z继承了X,因此先构造父类的对象,父类的对象b调用了Y的构造方法Y(),因此第一个打印出的是“Y”;然后父类本身的构造方法X()运行,因此再打印出“X”;父类中的完成后回到子类Z本身,Z中的对象y调用了Y()方法,因此接下来打印“Y”;最后是Z的构造方法,打印“Z”,至此程序结束。
作者: lpflpy    时间: 2013-5-28 10:31
本帖最后由 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. }
复制代码

作者: 无妄无涯    时间: 2013-5-28 10:41
lpflpy 发表于 2013-5-28 10:31
首先,在子类的构造方法(1)执行之前会先执行父类的构造方法,而父类中有变量和构造方法时,会先初始化变 ...

妹子就是比男人细腻,步骤列得杠杠的。{:3_57:}
作者: lpflpy    时间: 2013-5-28 10:49
无妄无涯 发表于 2013-5-28 10:41
妹子就是比男人细腻,步骤列得杠杠的。

那是!哈哈
作者: 小石头39910    时间: 2013-5-28 11:16
我是那样想的,主函数先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。其实我也有点郁闷。
作者: 画饼    时间: 2013-5-28 11:26
无妄无涯 发表于 2013-5-28 10:41
妹子就是比男人细腻,步骤列得杠杠的。

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


这三个怎么区分呢




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