Java多态和所依赖的动态绑定

一:什么是多态?多态能干什么?

首先,在面向对象的编程中,多态是继数据抽象和继承之后的第三种基本特征。

简单来说,多态是消除类型之间的耦合关系。为什么这么说呢,举个例子,当你自动向上转型的时候,你怎么知道它原来是哪种类型。多态就是为了解决这个的。

在继承里面了解到:继承允许将对象视为自己本身的类型或者是基类类型,这样同一份代码就可以在毫无差别的情况下运行在其他类型之上了。而多态的方法调用允许一种类型表现出与其他类型的区别,只要他们都是从同一基类导出来的。这种差异性体现在方法的重写上面。

二:多态的体现方式

①:方法的重写和重载,

②:向上转型和向下转型 。 

本文主要讨论第二种方式。

我们知道,假如现在有一个基类叫做Person,而它的子类叫做Student,基类里面有一个run()方法(非private和static),那么子类应该有具有同样的方法,在父类这个方法里面执行

System.out.println("父类run");

在子类run方法里面执行

System.out.println("子类run");

那么当有如下声明子类的方式,其结果必然为:子类run

Person per = new Student();
   per.run();

请思考:

为什么它会自己寻找子类的方法体呢?

这就引出了接下来要介绍的方法调用绑定

三:方法调用绑定

通常,我们将一个方法调用同一个方法主体关联起来称作绑定。如果在程序执行前进行绑定,我们将这种绑定方法称作前期绑定。在面向过程语言中,比如c,这种方法是默认的也是唯一的。如果我们在java中采用前期绑定,很有可能编译器会因为在这庞大的继承实现体系中去绑定哪个方法而感到迷惑。解决的办法就是动态绑定,这种后期绑定的方法,在运行的时候根据对象的类型进行绑定。

①:静态绑定(前期绑定)

在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现。例如:C。
针对java简单的可以理解为程序编译期的绑定;这里特别说明一点,java当中的方法只有final,static,private和构造方法是前期绑定(private方法可以算作是属于final方法)。

②:动态绑定(后期绑定)

虚拟机提取对象的实际类型的方法表;
虚拟机搜索方法签名;
调用方法。

java的jvm方法调用机制利用动态绑定来完成实际类型的判断。

四:构造器与多态

构造器的调用顺序也体现着多态的存在。(尽管构造器隐式的声明为static,构造器并不具有多态性)

父类的构造器总是在子类构造器调用的过程中被调用,而且按照继承层次逐渐向上的链接,以使每个父类的构造器都能被正确的调用。这样做是很有必要的,因为构造器有一项特殊的任务,检查对象是否被正确的构造。子类方法只能访问自己的成员,不能访问父类中的成员。只有基类的构造器才具有恰当的权限对自己的元素进行初始化。因此必须要让每个构造器都能得到调用,否则不能构造出正确的完整的对象。

猜你喜欢

转载自blog.csdn.net/zy934236179/article/details/81334304