java细节篇之动态绑定机制

大家好,我是教授.F

动态绑定机制,在对象上体现。

一个对象有编译类型和运行类型,运行类型看 = 号的右边,编译类型看 = 号的左边。

例如:

public Test{
    public static void main(String[] args){
        Animal animal = new Dog();
    }
}
class Aniaml{
}
class Dog extends Animal{
}

这时编译类型为Animal,运行类型为Dog。

这时要注意了,这个animal能调用什么方法要看Animal中有什么方法,Animal有什么方法才能调用什么方法,这时在编译期间的,也就是你写完后,仅仅只能证明语句不会报错。那在运行期间,animal是要跑到Dog中看看是否有你写的那些方法,如果没有,程序还是不能正常执行,如果有,则只会调用Dog中的成员。

那这有什么用?不纯纯的浪费时间吗?

其实不会的。如果现在有一个需求:父类是Animal,子类是Dog和Cat。如何完成堆Dog和Cat的喂养呢?这里就可以使用动态绑定机制。在父类中写了eat()的方法,然后Dog和Cat重写父类的eat()方法。如下面样式:

class Animal{
    public void eat(){
    }
}
class Dog extends Animal{
    @Override
    public void eat(){
    System.out.println("喂狗");
    }
}
class Cat extends Animal{
    @Override
    public void eat(){
    System.out.println("喂猫");
    }
}

当在main中写Animal animal1 = new Dog();和Animal animal2 = new Dog();时,输出的分别就是喂狗和喂猫了。

虽然直接使用Cat类和Dog类就能直接进行操作,但是在项目中,可能会造成一下问题:

  1. 耦合性高: 直接使用Cat和Dog类,如果后期需要引入更多的动物类,或者对原有类进行修改,可能会导致代码的耦合度增加,使得代码难以维护和扩展。

  2. 可扩展性差: 如果在代码中直接使用具体的子类,将限制您的代码在未来进行扩展的能力。通过动态绑定,您可以更容易地添加新的子类,而不需要修改现有的代码。

  3. 违反面向对象设计原则: 面向对象设计原则中的开闭原则告诉我们应该对扩展开放,对修改关闭。直接调用具体子类的方法可能会违反这一原则,而使用动态绑定则符合该原则。

动态绑定的好处包括:

  1. 多态性: 动态绑定实现了多态性,使得同一个方法调用根据不同的对象类型而表现出不同的行为,从而提高代码的灵活性。

  2. 简化代码: 动态绑定减少了代码中的条件判断和分支语句,使代码结构更加清晰简洁,易于理解和维护。

  3. 提高可扩展性: 使用动态绑定,您可以更轻松地添加新的子类并重写父类方法,而不需要修改现有的代码,从而提高代码的可扩展性。

  4. 代码复用: 动态绑定使得父类中定义的方法可以被多个子类重写并复用,减少了代码的重复编写。

因此,通过使用动态绑定,您可以更好地遵循面向对象设计原则,使代码更具扩展性、灵活性和可维护性。

注意:

  1. 当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定
  2. 当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用
  • 24
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值