Java_多态

多态性是面向对象编程三个重要特性之一。Java中的多态性是通过综合应用继承、覆盖,以及向上转型实现的。

多态给我们带来的好处,可以归纳为如下5点:

1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。

2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。

3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3 所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。

4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。

5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

值得注意的是,多态并不能够解决提高执行速度的问题,因为它基于动态装载和地址引用,或称动态绑定。但在Java中,除了final类和一定条件下的final方法外,所有方法都由JVM在运行期间进行动态绑定。

8.4  走进方法绑定

方法绑定(method binding)指产生调用方法的内存地址、相关参数和本地变量的处理过程。在执行调用时,JVM根据这些信息,能够执行内存地址中代表该方法的代码。因为构造器是一种特殊方法,方法绑定当然包括构造器绑定。前面提到过,Java提供两种方法绑定,即静态绑定和动态绑定。静态绑定发生在编译期间,由编译器完成;而动态绑定发生在运行期间,由JVM完成。

8.4.1  静态绑定

因为静态绑定在编译期间完成,可以提高代码的执行速度。因而在一般情况下,凡是能够在编译期间解决地址引用的方法调用,都采用静态绑定。静态绑定的方法包括:

静态方法。

构造器。

私有方法。

用关键字super调用的方法,包括使用super()调用超类构造器和super.superMethod()调用超类方法。

为了提高程序的运行速度,考虑在可能的情况下,尽量使用以上方法和方法调用。

8.4.2  动态绑定

Java中,除了以上四种方法外,由对象调用的方法都采用动态绑定。动态绑定在JVM执行代码期间产生,会减慢程序运行速度。但由于Java语言是一种动态链接语言,即所有代码,即使是静态绑定,都或多或少涉及到动态链接和引用,如下面将要讨论的参数装载和堆栈处理,以及invokespecial。这是为什么Java程序的运行速度比C或者C++慢的主要原因之一。

8.4.3  走进绑定和调用

无论是静态绑定还是动态绑定,在处理调用时,都经历从符号引用(symbolic reference),转换成为直接地址引用,证实合法、装载对象和参数、使用堆栈,这样一个过程。

符号引用到直接引用--符号引用提供对方法的识别,包括类名、方法名和方法描述(参数、参数类型、个数,以及返回类型)。在执行绑定操作时,首先根据对方法的识别信息,搜索该方法的储存地址,产生对这个地址的直接引用。直接引用通常包括这个地址的指针,或者地址位移值(offset),使得它允许JVM在执行这个方法时迅速地找到内存位置。

证实合法--在绑定处理过程中,还必须验证方法的调用是否遵循Java语言的规定、请求调用指令是否可安全执行、请求调用是否合法。例如,一个私有方法必须由当前执行对象的方法才可调用。如果证实步骤没有通过,JVM将抛出非法调用异常。

装载对象和参数--如果是对象方法,对象引用和方法参数必须装载到堆栈;如果是静态方法,只需将参数装入堆栈。因为静态方法将不涉及任何对象。

使用堆栈--在调用时,JVM将为执行这个方法产生一个堆栈框(stack frame)。这个堆栈框包括储存本地变量的空间、操作堆栈,以及其他JVM在具体运行时需要的信息。本地变量和操作堆栈需要的字节数在编译期间就已确定,并且已装载到字节码文件中,所以JVM知道需要保留多少储存器空间。在调用过程中,根据不同的运算和操作,JVM对堆栈框执行入栈和出栈的操作。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值