黑马程序员技术交流社区

标题: java子类继承父类问题 [打印本页]

作者: 张庚    时间: 2013-2-8 12:58
标题: java子类继承父类问题
class Foo {   
public int a;   
public Foo() { a = 3; }   
public void addFive() { a += 5; }   
}   
  
public class Bar extends Foo{   
    public int a;   
    public Bar() { a = 8; }   
    public void addFive() { this.a +=5; }   
      
    public static void main(String[] args) {   
        Foo foo = new Bar();   
         foo.addFive();   
         System.out.println("Value: "+ foo.a);   
    }   
  
}  
结果为什么输出的是3
可以试下~
求解释

作者: 范天成    时间: 2013-2-8 15:46
public static void main(String[] args) {   
        Foo foo = new Bar();   
         foo.addFive();   
         System.out.println("Value: "+ foo.a);  //foo.a是父类对象的a的值, public Foo() { a = 3; }这个是class Foo的构造函数!
    }   
  
}  
作者: sqlhelper    时间: 2013-2-8 16:00
我说一我的看法:
  Foo foo = new Bar();   
         foo.addFive();   
         System.out.println("Value: "+ foo.a);   
你的这三句话,第一句用到了多态。第二句其实可有可无,不然你注释一下,结果还是3。
因为有了多态,所以程序在编译的时候,他会看父类中的属性和行为,所以你第三句话才会打印3.

作者: 柴乔军    时间: 2013-2-8 17:10
毕老师将多态的视频里有总结的,调用成员变量,始终看左边,foo.a,是调用的foo类的成员变量,还是3
作者: 逍林游    时间: 2013-2-8 18:44
这里哪里有多态啊
父类的addFive();被覆盖了   

作者: 黄玉昆    时间: 2013-2-9 00:27
在多态中成员变量(和静态成员)的特点:
·无论编译和运行,都参考左边的,即引用型变量所属的类型。也就是说父类中有自己的变量,则先找父类自己的成员。如果自己有,那么就不再找子类的成员变量了。
而且,我觉得,就像sqlhelper说的一样,你这个addFive方法到底要干啥呢?仅仅是求个值,你调用foo.addFive();也不打印,就让它在虚拟机中“溜个弯”?就没事了?
我觉得你既然定义为void的类型,就是想打印一下结果吧,要不你就顶一个int类型,让他返回一个int型,再在main函数中打印。我给你稍微改动了一下你的程序,你再看看结果:
  1. class Foo{
  2.         public int a;
  3.         public Foo(){
  4.                 a = 3;
  5.         }   
  6.         public void addFive(){
  7.                 a += 5;
  8.                 System.out.println(a);//打印一下计算后的结果
  9.         }   
  10. }   
  11.   
  12. public class Bar extends Foo{   
  13.     public int a;   
  14.     public Bar(){
  15.                 a = 8;
  16.         }   
  17.     public void addFive(){
  18.                 this.a +=5;
  19.                 System.out.println(a);//打印一下计算后的结果
  20.         }      
  21.     public static void main(String[] args){   
  22.         Foo foo = new Bar();
  23.                 Bar b = (Bar)foo;//强转为子类Bar类型
  24.         foo.addFive(); //值为13,这就可以体现出多态了。否则就成8了。
  25.                 System.out.println("Vaule: "+ b.a);//值为13
  26.         System.out.println("Vaule1: "+ foo.a);   
  27.     }   
  28. }
复制代码

作者: 黄玉昆    时间: 2013-2-9 00:29
这是我关于多态的总结,你可以看看
地址:http://blog.csdn.net/shengfeixiang/article/details/8576448




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