介绍
这次要讲解的内容非常有尿点,因为知道答案后你会非常的高兴,orz*
方法重写中存在的问题
public class TestMianSi03 {
public static void main(String[] args) {
AA aa=new BB();
//学过Java的人都知道这里输出40对吧!!
//笔者在这里想问各位读者一句话:"为什么答案输出40"
//你可能会回答,这是是多态啊,肯定是40咯,那我再问一句,多态就40??为什么呢??为什么多态就40呢??
System.out.println(aa.getResult());
}
}
class AA{
public int i=10;
public int getResult(){
return i+10;
}
}
class BB extends AA{
public int i=20;
public int getResult(){
return i+20;
}
}
再来看个例子:
public class TestMianSi03 {
public static void main(String[] args) {
AA aa=new BB();
//请问这会输出什么??30??
System.out.println(aa.getResult());
}
}
class AA{
public int i=10;
public int getResult(){
return i+10;
}
}
class BB extends AA{
public int i=20;
}
答
对于第一篇代码中问题的正确答案:
虽然说第一篇代码中是多态的应用,但是我多问了一个为什么你就会不知道了,对吧?
其实多态是这样的:它本身是动态绑定,当调用成员方法时,JVM会将方法和实际的内存(堆)进行绑定,会调用实际内存中的方法。所以我们就看到了这样的现象!!对,没错,就是这样!!
对于第二篇代码中问题的正确答案:
正确输出应该是20,为什么呢??
虽然方法的调用会对实际内存进行动态绑定,但是属性不会啊,我们并没有提到属性会动态绑定好吧!!
这里我想问问,在aa这个对象中有多少个i呢??如果只有一个i当然就是BB的i对AA的i覆盖了,最终输出30。
但是偏偏aa这个对象里面有两个i。
没错,对,就是这样,有两个i。
也就是说,当我们调用方法的时候,我们在纠结到底使用哪儿一个i对吧?
其实这里有个规则就是:调用哪儿个类的方法,就使用哪儿个类的成员变量。
第二篇代码的执行过程就是,当我们调用aa.getResult()方法的时候,就会查找BB这个类里面是否有getResult这个方法,如果没有就会查找AA类里面是否有这个方法,如果有就会调用AA类里面的getResult方法,最终在AA类的getResult方法里面使用AA类的成员变量i。
好,非常Nice!!!