黑马程序员技术交流社区

标题: 帮忙解决一个小问题 [打印本页]

作者: AnElse    时间: 2015-1-14 20:13
标题: 帮忙解决一个小问题
  1. class Fu
  2. {
  3.     int num = 9;

  4.     {
  5.         System. out.println("Fu" );
  6.     }

  7.     Fu()
  8.         {
  9.         super();
  10.         show();//这里省略了this.
  11.                 System.out.println("AAAA");
  12.     }
  13.       
  14.         void show()
  15.         {
  16.         System. out.println("fu show " + num);//被覆盖,运行子类的
  17.     }
  18. }

  19. class Zi extends Fu
  20. {
  21.     int num = 8;

  22.     {
  23.         System. out.println("Zi" );
  24.     }

  25.     Zi()
  26.         {
  27.         super();
  28.         show();
  29.     }

  30.     void show()
  31.         {
  32.         System. out.println("zi show " + num);
  33.     }
  34. }

  35. public class ExtendsDemojava
  36. {
  37.     public static void main(String[] args)
  38.         {
  39.         new Zi();
  40.     }
  41. /*
  42. 在JDK1.6中输出结果为
  43. ————————————————————
  44. Fu
  45. zi show 0
  46. Zi
  47. zi show 8
  48. ————————————————————

  49. */
  50. }
复制代码
                第二个为什么输出 zi show 0 ???


作者: AnElse    时间: 2015-1-14 20:52
谁能帮忙解答一下,谢谢
作者: MR.J    时间: 2015-1-14 22:11
我说一下,不知道对不对,打印第一个Fu后就要打印父类中的造方法中的show函数,而show函数被子类中的show方法把重写,所以打印的是zi show 0/
作者: Imp_x    时间: 2015-1-14 22:15
成员变量的赋值是在构造函数运行后才赋值的,构造函数还没运行完,所以还没给num赋值,而成员变量有默认初始化值 基本类型是0 引用类型为null  所以打印的是0
作者: MR.J    时间: 2015-1-14 22:17
不好意思,刚才 我没看清题,那样说不正确。
作者: AnElse    时间: 2015-1-14 23:43
Imp_x 发表于 2015-1-14 22:15
成员变量的赋值是在构造函数运行后才赋值的,构造函数还没运行完,所以还没给num赋值,而成员变量有默认初 ...

从结果分析貌似是这样,但是我有一点不解,成员变量的默认初始化与显示初始化不都是在构造函数之前完整的吗?求解
作者: AnElse    时间: 2015-1-14 23:45
MR.J 发表于 2015-1-14 22:17
不好意思,刚才 我没看清题,那样说不正确。

没事,谢谢解答
作者: jojo    时间: 2015-1-15 00:12
楼主要弄清楚,子父类初始化时,各变量 函数 代码块 初始顺序问题
作者: AnElse    时间: 2015-1-15 00:29
jojo 发表于 2015-1-15 00:12
楼主要弄清楚,子父类初始化时,各变量 函数 代码块 初始顺序问题

谢谢,刚想到应该是这个问题。。
作者: Imp_x    时间: 2015-1-15 00:30
AnElse 发表于 2015-1-14 23:43
从结果分析貌似是这样,但是我有一点不解,成员变量的默认初始化与显示初始化不都是在构造函数之前完整的 ...

视频里有说的啊= =构造函数就是为了给成员变量初始化用的,显示初始化肯定在构造函数完成后完成初始化
另成员变量在构造前就有默认初始化值了,基本类型为0,引用类型为null
而且当父类,和子类都有Static时,先初始化Static,再初始化子类的Static,再初始化父类的其他成员变量->父类构造方法->子类其他成员变量->子类的构造方法。
父类上层还有父类时,总是先执行最顶层父类的Static-->派生类Static-->派生类Static-->.......-->子类Static-->顶层父类的其他成员变量-->父类构造方法--> 派生类的其他成员变量 --> 派生类构造方法--> ...............-->子类其他成员变量-->子类构造方法
大概就这样,我记得视频里有详细说过构造函数静态那些执行顺序的啊{:3_66:}




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