日期:2014-05-20  浏览次数:20860 次

麻烦分析下这个简单的java程序
public class AA {
int count = 2;

public void getCount() {

System.out.println("A" + this.count);
}

}

class BB extends AA {
int count = 20;

// 重写方法
public void getCount() {
System.out.println("B" + this.count);
}
}

class Test{
public static void main(String[] args) {
AA a=new AA();
System.out.println("直接调用A的变量"+a.count);//1
a.getCount();//2
BB b=new BB();//3
System.out.println("直接调用B的变量"+b.count);//4
b.getCount();//5
AA ab=new BB();//6
System.out.println("----"+ab.count);//7
ab.getCount();//8
 
}
}
输出 标志的1,2,3,4,5,6,7,8等处得值
麻烦解释下 7,8两处。尤其是7那里 和我猜想不一样,应该是我没理解对!请高手帮忙解释

------解决方案--------------------
方法有多态,成员变量无多态。
------解决方案--------------------
我没有拿来测试!我想8应该是类BB的getCount();当你学到多态的时候你会明白(当然,你这个程序并不存在多态)。7应该是AA的Count,虽然引用ab指向BB,但他是父类的引用。


呵呵,去测试下看。
------解决方案--------------------
不明白为什么lz的public类是AA,而含有main方法的Test类确实默认的访问权限,这程序能跑吗???


除开这个问题,其它就是继承和多态的问题。

Java的成员变量不支持后期绑定,和引用类型保持一致,而方法是后期绑定,所以和对象的类型一致。

因此,7的值为AA里面的2,而8的值是调用了BB中的getCount()方法,得到的值为20。

简而言之就是,多态只针对方法,不针对成员变量

希望这个答案对你有帮助
------解决方案--------------------
探讨
引用:
我没有拿来测试!我想8应该是类BB的getCount();当你学到多态的时候你会明白(当然,你这个程序并不存在多态)。7应该是AA的Count,虽然引用ab指向BB,但他是父类的引用。


呵呵,去测试下看。

完全正确的!但是我就是不明白咯:7那里也是BB 的对象啊!是BB对象调用的count啊为什么不是20呢?
AA ab=new BB()……

------解决方案--------------------
探讨
方法有多态,成员变量无多态。

------解决方案--------------------
定理一:我们可以把子类对象当做父类对象来用,但当我们这么做了,我们就只能调用父类中的属性和方法。
定理二:当我们把子类对象当做父类对象来看,如果子类覆盖了父类的方法,那调用的是子类覆写了的方法。
这是所有的多态问题的基础。
你应该知道程序输出什么了。
2 2 20 20 2 20