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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张庚 中级黑马   /  2013-2-8 12:58  /  1556 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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
可以试下~
求解释

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9

查看全部评分

6 个回复

倒序浏览
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的构造函数!
    }   
  
}  
回复 使用道具 举报
我说一我的看法:
  Foo foo = new Bar();   
         foo.addFive();   
         System.out.println("Value: "+ foo.a);   
你的这三句话,第一句用到了多态。第二句其实可有可无,不然你注释一下,结果还是3。
因为有了多态,所以程序在编译的时候,他会看父类中的属性和行为,所以你第三句话才会打印3.
回复 使用道具 举报
毕老师将多态的视频里有总结的,调用成员变量,始终看左边,foo.a,是调用的foo类的成员变量,还是3
回复 使用道具 举报
这里哪里有多态啊
父类的addFive();被覆盖了   
回复 使用道具 举报
在多态中成员变量(和静态成员)的特点:
·无论编译和运行,都参考左边的,即引用型变量所属的类型。也就是说父类中有自己的变量,则先找父类自己的成员。如果自己有,那么就不再找子类的成员变量了。
而且,我觉得,就像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. }
复制代码
回复 使用道具 举报
这是我关于多态的总结,你可以看看
地址:http://blog.csdn.net/shengfeixiang/article/details/8576448
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马