黑马程序员技术交流社区

标题: 代码结果预期不一致 [打印本页]

作者: 广驰    时间: 2012-9-8 00:42
标题: 代码结果预期不一致
本帖最后由 应广驰 于 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的对象么


作者: 郑义    时间: 2012-9-8 08:21
遇到这种问题,你可以在你的代码中添加输出语句,看看哪句代码执行,哪句不执行,以便进行分析。
看代码
  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 08:41
本帖最后由 朱烈葵 于 2012-9-8 08:57 编辑


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

这种方法很好学习了
作者: 广驰    时间: 2012-9-8 11:52
问题已解决
作者: 梁志冰    时间: 2012-9-8 20:04
郑义 发表于 2012-9-8 08:21
遇到这种问题,你可以在你的代码中添加输出语句,看看哪句代码执行,哪句不执行,以便进行分析。
看代码: ...

很好的学习调试方法,学习了!




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