时间:2021-05-20
这篇文章主要介绍了Java多态中动态绑定原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
多态是面向对象程序设计非常重要的特性,它让程序拥有 更好的可读性和可扩展性。
自始至终,多态都是对于方法而言,对于类中的成员变量,没有多态的说法。
一个基类的引用变量接收不同子类的对象将会调用子类对应的方法,这其实就是动态绑定的过程。在理解动态绑定之前,先补充一些概念。
引用变量的类型
引用类型的变量具有两种类型:编译时类型和运行时类型。(也分别叫做声明类型和实际类型)举个简单的例子:
//假设Student类是Person类的子类Person p = new Student();编译时类型
运行时类型
方法绑定
将方法调用同方法主体关联起来被称为绑定。
静态绑定
在程序执行前进行绑定,叫做静态绑定,也称作前期绑定。在面向过程的语言中是默认的绑定方式。
在Java中,用private、static和final修饰的方法(static和final之后会做出总结)或构造器能够准确地让编译器调用哪个方法,就是静态绑定(static binding)。
动态绑定
在运行时根据对象的运行时类型进行绑定,叫做动态绑定,也叫做后期绑定。当然在Java中,除了静态绑定的那些方法,其他方法的调用方式就是动态绑定啦。
public class DynamicBinding { //Object是所有类的超类,根据向上转型,该方法可以接受任何类型的对象 public static void test(Object x) { System.out.println(x.toString()); } public static void main(String[] args) { test(new PrimaryStudent());//Student test(new Student());//Student test(new Person());//Person test(new Object());//java.lang.Object@1b6d3586 }}class Person extends Object { @Override public String toString() { return "Person"; } public void run(){} public void count(int a){}}class Student extends Person { @Override public String toString() { return "Student"; } public void jump(){}}class PrimaryStudent extends Student {}四句调用方法的语句中的形参,编译时类型都是Object。注意:引用变量只能调用编译时类型所具有的方法。
它们运行时类型各不相同,所以解释运行器在运行时,会调用它们各自类型中重写的方法。
相同的类型的引用变量,在调用同一个方法时,表现出不同的行为特征,这就是多态最直观的体现吧。
方法表
我们还可以发现,test(new PrimaryStudent());的运行结果是Student,,结果很明显,因为PrimaryStudent类中并没有重写父类的方法,如果采用动态绑定的方式调用方法,虚拟机会首先在本类中寻找适合的方法,如果没有,会一直向父类寻找,直到找到为止。
那么,每次调用时都要向上寻找,时间开销必然会很大。为此虚拟机预先为每个类都创建了方法表,其中列出了所有的方法签名(返回值类型不算)和实际调用的方法,这样子的话,在调用方法时直接查表就可以了。(值得一提的是,如果用super限定调用父类方法,那么将直接在实际类型的父类的表中查找)
下面是Person类的方法表:
下面是Student类的方法表:
下面是PrimaryStudent类的方法表(PrimaryStudent类为空,直接继承Student类):
因此,在执行test(new PrimaryStudent());语句时,虚拟机将会提取PrimaryStudent的方法表。
虚拟机将会在表中搜索定义toString签名的类。这时虚拟机已经知道需要调用Student类型的toString()方法。
最后,调用方法,完毕。
动态绑定大大提升了程序的可扩展性,比如,我现在要新增一个Teacher类,可以直接让Teacher类继承于Person类,再用
Object类的引用指向Teacher对象,而不用做其他的代码调整,动态绑定自动搞定,就相当舒服。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
为了支持c++的多态性,才用了动态绑定和静态绑定。理解他们的区别有助于更好的理解多态性,以及在编程的过程中避免犯错误。需要理解四个名词:1、对象的静态类型:对象
一、多态C++多态通过继承和动态绑定实现。继承是一种代码或者功能的传承共享,从语言的角度它是外在的、形式上的,极易理解。而动态绑定则是从语言的底层实现保证了多态
在java中多态分为两种编译时多态(重载)和运行时多态(重写),编译时多态又叫前绑定,运行时多态又叫后绑定。下面用一个例子说明:publicclassOverl
本文主要研究的是关于Java中重载,重写,多态,静态绑定、动态绑定的相关内容,具体如下。重载,英文名是overload,是指在一个类中定义了一个以上具有相同名称
Java多态是如何实现的?Java的多态和C++一样,是通过延时绑定(latebinding)或者说运行时绑定(runtimebinding)来实现的。当调用某