java的动态绑定机制

本文通过实例代码深入探讨Java的动态绑定机制,解释了在多态环境中对象方法调用的规则。动态绑定使得运行时决定方法调用,确保了子类对父类方法的覆盖有效。当调用对象方法时,系统会根据对象的运行类型绑定相应的方法实现。通过注释代码,展示了动态绑定在继承和方法调用中的应用,帮助读者理解面向对象编程中的这一关键概念。
摘要由CSDN通过智能技术生成

前言:

        我们都知道面向对象的三大特性是:封装,继承和多态,并且在继续深入的学习中我们能够发现,封装和继承几乎都是为多态而准备的。因此,想要完全掌握面向对象编程,就需要我们深刻的理解多态这个知识点,而想要达到这个目的,就需要弄明白本文的主角:java的动态绑定机制(DynamicBinding)

引入:

        在正式解释Java的动态绑定机制之前,让我们先来看这样一串代码

public class DynamicBinding {
    public static void main(String[] args) {
        Base b=new Sub();
        System.out.println("调用b.sum()方法可以得到:"+b.sum());
    }
}
class Base{//父类
    public int i=10;
    public int sum(){
        return getI()+10;
    }
    public int getI(){
        return i;
    }
}
class Sub extends Base{//子类
    public int i=20;
    public int sum(){
        return i+20;
    }
    public int getI(){
        return i;
    }
}

相信各位小伙伴已经知道结果了吧!这串代码最终的输出结果是:

        调用b.sum()方法可以得到:40

至于为什么会打印输出这样的结果,下面就让我们一起来分析一下这其中的调用情况。

        首先,从语句Base b=new Sub();中我们能判断出,这里b 的编译类型是 Base,运行类型是 Sub(编译类型看=号左边,运行类型看=号右边)。

        但是,从下一条语句System.out.println("调用b.sum()方法可以得到:"+b.sum());开始,可能就有小伙伴开始蒙圈了,因为Base类和Sub类中都有sum()和sum1()方法,到底调用的是Base类中的方法还是Sub类中的方法呢?这就引出了我们的主角:java的动态绑定机制(DynamicBinding)

正文:

        java的动态绑定机制:

        (1)当调用对象方法的时候,该方法会和该对象的运行类型绑定

        (2)当调用对象的属性时,没有动态绑定机制,哪里声明就在哪里使用

因此,回到这串代码中,根据该机制可以知道:

由于对象b的运行类型为Sub,所以,当调用sum()方法时,会优先调用Sub类中的sum()方法。

而sum()方法中返回的属性i;由于没有动态绑定,就直接调用在Sub类中定义的属性i=20;所以就会得到返回值20+20=40,因此输出结果为调用b.sum()方法可以得到:40

        事实上,动态绑定机制在多态中的运用十分灵活,为了帮助更好的明白这其中的规则和原理

下面我们就将Sub子类中的sum()方法注释掉,来帮助我们更加深刻的理解。

public class DynamicBinding {
    public static void main(String[] args) {
        Base b=new Sub();
        System.out.println("调用b.sum()方法可以得到:"+b.sum());
    }
}
class Base{//父类
    public int i=10;
    public int sum(){
        return getI()+10;
    }
    public int getI(){
        return i;
    }
}
class Sub extends Base{//子类
    public int i=20;
//    public int sum(){
//        return i+20;
//    }
    public int getI(){
        return i;
    }
    
}

        首先,在System.out.println("调用b.sum()方法可以得到:"+b.sum());语句中,b.sum()调用时会遵循动态绑定机制去调用其运行类型Sub子类中的sum()方法,但是,由于Sub子类中的sum()方法被注释掉了,所以,b.sum()调用时会根据继承机制去他的父类Base类中寻找sum()方法,并执行父类sum()方法中的return getI()+10;语句,但执行getI()方法时,又会产生动态绑定,系统会去执行对象b的运行类型Sub中的getI()方法,继而执行Sub类中的return i;语句,而属性i没有动态绑定机制,因此会调用Sub中声明的属性i;即public int i=20;最终返回的运行结果就是:

        调用b.sum()方法可以得到:30

而不是
        调用b.sum()方法可以得到:20

        如果大家有被绕晕的话,不妨自己写写代码并通过注释一部分代码来验证下自己的思路正不正确,如果我讲述的部分有任何问题,欢迎各位指正。

总结:

        动态绑定机制在多态中的运用可以十分的灵活,我们只有弄明白了这其中的逻辑和原理,才能完全的掌握面向对象的思想。最后,当我们创建对象时,一定要搞清楚这个对象的编译类型和运行类型,这样才能帮助我们更好的理解后面的代码逻辑。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小西瓜呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值