麻烦分析下这个简单的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。
简而言之就是,多态只针对方法,不针对成员变量
希望这个答案对你有帮助
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------定理一:我们可以把子类对象当做父类对象来用,但当我们这么做了,我们就只能调用父类中的属性和方法。
定理二:当我们把子类对象当做父类对象来看,如果子类覆盖了父类的方法,那调用的是子类覆写了的方法。
这是所有的多态问题的基础。
你应该知道程序输出什么了。
2 2 20 20 2 20