Java 动态绑定 静态绑定

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 动态绑定 静态绑定的主要内容,如果未能解决你的问题,请参考以下文章

Java方法的静态绑定与动态绑定讲解(向上转型的运行机制详解)

Java : 多态表现:静态绑定与动态绑定(向上转型的运行机制)

“全栈2019”Java第五十五章:方法的静态绑定与动态绑定

Scala核心编程_第08章 面向对象编程(中级补充)--java动态绑定与静态绑定

Scala核心编程_第08章 面向对象编程(中级补充)--java动态绑定与静态绑定

静态绑定与动态绑定