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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 广驰 中级黑马   /  2012-9-8 00:42  /  1481 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 应广驰 于 2012-9-8 11:52 编辑
  1. class A
  2. {
  3.         public A()
  4.         {
  5.                 this.show();
  6.         }
  7.         
  8.          public void show(){}

  9. }

  10. class B extends A
  11. {
  12.         int x=20;
  13.         public B(int x)
  14.         {
  15.                 this.x = x;
  16.         }

  17.         public void show()
  18.         {
  19.                 System.out.println("x="+x);
  20.         }
  21. }

  22. public class Tset
  23. {
  24.         public static void main(String[] args)
  25.         {
  26.                 A a = new B(200);
  27.         }
  28. }
复制代码
为什么输出结果是x=0,不是建立的是B的对象么

6 个回复

倒序浏览
遇到这种问题,你可以在你的代码中添加输出语句,看看哪句代码执行,哪句不执行,以便进行分析。
看代码
  1. class A
  2. {
  3.     public A()
  4.         {
  5.                         System.out.println("调用A的构造函数");
  6.             this.show();
  7.         }
  8.         public void show()
  9.                 {
  10.                         System.out.println("调用B的show函数");
  11.                 }

  12. }

  13. class B extends A
  14. {
  15.         int x=20;
  16.         public B(int x)
  17.         {
  18.                         System.out.println("调用B的构造函数");
  19.             this.x = x;
  20.         }

  21.         public void show()
  22.         {
  23.                         System.out.println("调用B的show函数");
  24.             System.out.println("x="+x);
  25.         }
  26. }

  27. public class Test
  28. {
  29.         public static void main(String[] args)
  30.         {
  31.                 A a = new B(200);
  32.         }
  33. }
复制代码
运行的结果如下:


下边分析一下
1、当你new子类对象的时候,默认是调用B的构造方法。
      而B的构造方法中,第一句是默认调用了父类A的无参构造方法。
      所以,你的第一句打印的是A中无参构造方法中的输出语句。
2、A中无参构造方法调用了show方法,而你的show方法已经被子类B复写,所以调用B的show方法。
       并打印此时的x,而此时x并没有被初始化,所以打印出0.
3、然后回到B的构造方法中继续执行,打印出输出语句。

其实,如果你想要输出传进去的200,只需要在后边再调用一次show方法就能够打印出来。

点评

哥们,这种方法很棒!你的答案很完美,像你学习了。  发表于 2012-9-8 11:58

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 朱烈葵 于 2012-9-8 08:57 编辑


简单来说当你构造父类的时候,调用的是子类的show方法,运行子类show的时候,x还没被初始化呢,所以为0
回复 使用道具 举报
郑义 发表于 2012-9-8 08:21
遇到这种问题,你可以在你的代码中添加输出语句,看看哪句代码执行,哪句不执行,以便进行分析。
看代码: ...

这种方法很好学习了
回复 使用道具 举报
问题已解决
回复 使用道具 举报
郑义 发表于 2012-9-8 08:21
遇到这种问题,你可以在你的代码中添加输出语句,看看哪句代码执行,哪句不执行,以便进行分析。
看代码: ...

很好的学习调试方法,学习了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马