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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© AnElse 中级黑马   /  2015-1-14 20:13  /  1175 人查看  /  9 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

  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 ???

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 加油

查看全部评分

9 个回复

倒序浏览
谁能帮忙解答一下,谢谢
回复 使用道具 举报
我说一下,不知道对不对,打印第一个Fu后就要打印父类中的造方法中的show函数,而show函数被子类中的show方法把重写,所以打印的是zi show 0/
回复 使用道具 举报
成员变量的赋值是在构造函数运行后才赋值的,构造函数还没运行完,所以还没给num赋值,而成员变量有默认初始化值 基本类型是0 引用类型为null  所以打印的是0

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
不好意思,刚才 我没看清题,那样说不正确。
回复 使用道具 举报
Imp_x 发表于 2015-1-14 22:15
成员变量的赋值是在构造函数运行后才赋值的,构造函数还没运行完,所以还没给num赋值,而成员变量有默认初 ...

从结果分析貌似是这样,但是我有一点不解,成员变量的默认初始化与显示初始化不都是在构造函数之前完整的吗?求解
回复 使用道具 举报
AnElse 中级黑马 2015-1-14 23:45:11
7#
MR.J 发表于 2015-1-14 22:17
不好意思,刚才 我没看清题,那样说不正确。

没事,谢谢解答
回复 使用道具 举报
jojo 中级黑马 2015-1-15 00:12:32
8#
楼主要弄清楚,子父类初始化时,各变量 函数 代码块 初始顺序问题
回复 使用道具 举报
AnElse 中级黑马 2015-1-15 00:29:32
9#
jojo 发表于 2015-1-15 00:12
楼主要弄清楚,子父类初始化时,各变量 函数 代码块 初始顺序问题

谢谢,刚想到应该是这个问题。。
回复 使用道具 举报
Imp_x 高级黑马 2015-1-15 00:30:45
10#
AnElse 发表于 2015-1-14 23:43
从结果分析貌似是这样,但是我有一点不解,成员变量的默认初始化与显示初始化不都是在构造函数之前完整的 ...

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

评分

参与人数 1技术分 +2 收起 理由
杨佳名 + 2

查看全部评分

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