黑马程序员技术交流社区

标题: 这个运行的答案为什么是这个??谁能解释下答案??? [打印本页]

作者: 马伟奇    时间: 2013-5-6 09:48
标题: 这个运行的答案为什么是这个??谁能解释下答案???
本帖最后由 马伟奇 于 2013-5-6 10:04 编辑
  1. class Father {
  2.                 int m =6;

  3.                 public Father() {
  4.                         this.show();
  5.                 }

  6.                 void show() {
  7.                         System.out.println("父");
  8.                 }
  9.         }

  10.         class Child1 extends Father {
  11.                 int m =10;
  12.                  void show() {
  13.                         System.out.println(m);
  14.                 }
  15.         }

  16.         class Child2 extends Father {
  17.                 void show() {
  18.                         System.out.println(m);
  19.                 }
  20.         }

  21.         class Test1 {
  22.                 public static void main(String args[]) {
  23.                         Father n = new Child1();
  24.                         Father n1 = new Child2();
  25.                 }
  26. }
复制代码

作者: askyle    时间: 2013-5-6 10:01
你运行一下就会有结果
作者: 马伟奇    时间: 2013-5-6 10:03
askyle 发表于 2013-5-6 10:01
你运行一下就会有结果

我运行了,我知道结果,我想要的是结果的解释
作者: 殇_心。    时间: 2013-5-6 10:11
你代码看得我晕了。
结果是: 0   6
原因是:
Father n = new Child1(); //多态。父类引用子类对象。父类构造函数中this.show(),此时this指向Child1.
                      // 也就是说调用子类的show。问题出来了。为什么输出是0呢。                  
                      // 子类show又输出m,m是子类的成员变量,父类不知道m的值。
                      //所以jvm就会给m初始化。也就是0。所以就输出0咯。

Father n1 = new Child2();//输出6。这里的6是继承自父类的m。这个理解不难。

作者: 殇_心。    时间: 2013-5-6 10:19
建议楼主把代码格式搞好。
我都把那啥类都看成内部类了。
内牛满面啊!!!!
作者: 曹德君    时间: 2013-5-6 11:23
稍微改了一下,这样更好理解点。
  1. class Father
  2. {
  3.         int m 6;
  4.         int x =99;
  5.         public Father()
  6.         {
  7.                         this.show();
  8.         }

  9.         void show()
  10.         {
  11.                         System.out.println("父");
  12.         }
  13. }

  14. class Child1 extends Father
  15. {
  16.         int m =10;
  17.         int num;
  18.         void show()
  19.         {       
  20.                 System.out.println(x);//使用的是父类的成员变量的值。
  21.                 System.out.println(num);//当子类的成员变量值没有初始化,jvm会自动将其初始化为0
  22.                 System.out.println(m);//子类show输出m,m是子类的成员变量,父类不知道m的值。于是初始化m。
  23.         }
  24. }

  25. class Child2 extends Father
  26. {
  27.         void show()
  28.         {
  29.                 System.out.println(m);
  30.         }
  31. }

  32. class Test1
  33. {
  34.         public static void main(String args[])
  35.         {
  36.                         Father n = new Child1();
  37.                         Father n1 = new Child2();
  38.         }
  39. }
复制代码

作者: 黄玉昆    时间: 2013-5-6 23:01
如果问题未解决,请继续追问,如果问题解决了,请将分类改为“已解决”,谢谢




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