Java方法重写到底调用哪儿一个方法,到底用本类还是父类的成员变量

介绍

这次要讲解的内容非常有尿点,因为知道答案后你会非常的高兴,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!!!

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值