• Java 动态绑定 静态绑定


    绑定的概念:

    绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说,绑定分为静态绑定和动态绑定,或者叫做前期绑定和后期绑定。


    静态绑定:

    在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现。

    针对java简单的可以理解为程序编译期的绑定,这里特别说明一点,java当中的方法只有final,static,private和构造方法是前期绑定

     


     

    动态绑定:

    在运行时根据具体对象的类型进行绑定。

    若一种语言实现了动态绑定,同时必须提供一些机制,可在运行期间判断对象的类型,并分别调用适当的方法。也就是说,编译器此时依然不知道对象的类型,但方法调用机制能自己去调查,找到正确的方法主体。不同的语言对后期绑定的实现方法是有所区别的。但我们至少可以这样认为:它们都要在对象中安插某些特殊类型的信息。


     

    Java动态绑定的过程:

    • 编译器查看对象的声明类型和方法名。假设调用x.f(param),且隐式参数x声明为C类的对象。编译器将会一一列举所有C类中名为f的方法和其父类中访问属性为public且名为f的方法。

    至此,编译器已获得所有可能被调用的候选方法。

    • 接下来,编译器将查看调用方法时提供的参数类型。如果在所有名为f的方法中存在一个与提供的参数类型完全匹配,就选择这个方法。这个过程被称为重载解析( overloadingresolution)。如果编译器没有找到与参数类型匹配的方法,或者发现经过类型转换后有多个方法与之匹配,就会报告一个错误。

    至此,编译器已获得需要调用的方法名字和参数类型。

    • 如果是private方法、 static方法、 final方法或者构造器,那么编译器将可以准确地知道应该调用哪个方法,我们将这种调用方式称为静态绑定( static binding)。与此对应的是,调用的方法依赖于隐式参数的实际类型,并且在运行时实现动态绑定。 
    • 当程序运行,并且采用动态绑定调用方法时,虚拟机一定调用与x所引用对象的实际类型最合适的那个类的方法。假设x 的实际类型是D,它是C类的子类。如果D类定义了方法f(String),就直接调用它;否则,将在D类的超类中寻找f(String),以此类推。

     


     

    总结:

    Java中,几乎所有的方法都是动态绑定的,在运行时动态绑定方法属于子类还是父类。但是也有特殊,针对static方法和final方法由于不能被继承,因此在编译时就可以确定他们的值,他们是属于静态绑定的。特别说明的一点是,private声明的方法和成员变量不能被子类继承,所有的private方法都被隐式的指定为final的(由此我们也可以知道:将方法声明为final类型的一是为了防止方法被覆盖,二是为了有效的关闭Java中的动态绑定)。

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 阮小二买彩票
    Java实现 蓝桥杯VIP 算法提高 传染病控制
    Java实现 蓝桥杯VIP 算法提高 传染病控制
    Java实现 蓝桥杯VIP 算法提高 传染病控制
    Java实现 蓝桥杯VIP 算法提高 传染病控制
    Java实现 蓝桥杯VIP 算法提高 传染病控制
    Java实现 蓝桥杯VIP 算法提高 企业奖金发放
    Java实现 蓝桥杯VIP 算法提高 企业奖金发放
    让程序后台隐藏运行
    只要你喜欢,并且可以养家糊口,就是好的
  • 原文地址:https://www.cnblogs.com/tsai/p/5336619.html
Copyright © 2020-2023  润新知