首页 理论教育 引用类型变量是如何实现多态的

引用类型变量是如何实现多态的

时间:2022-02-28 理论教育 版权反馈
【摘要】:在存在父子关系继承的情况下,存在一个父类或接口的引用类型变量,和多个已经实例化的子类对象或实现了接口的子类对象。对于一个引用型变量,在编译期间编译器按照它声明的类型进行检查处理,而在运行期间,Java虚拟机采用如下绑定规则:实例方法与引用类型变量实际引用对象的方法绑定。引用类型变量常在引用类型转换、引用类型作参数和引用类型作类的成员变量的场合下实现多态。

5.7.1 引用类型变量是如何实现多态的

一个对象只有一种形式,没有什么不确定的,这是由于构造方法所明确决定的。但是对象的引用类型变量具有多态性。

在存在父子关系继承的情况下,存在一个父类或接口的引用类型变量,和多个已经实例化的子类对象或实现了接口的子类对象。

例如,在平面几何中,有圆、矩形和三角形。对它们进行抽象形成圆类Circle、矩形类Rectangle和三角形类Triangle。再对这3个类的公共属性和方法抽象出来,形成它们的父类图形类Shape。这4个类的继承关系如下:

img330

为了实现多态,首先,定义一个父类或接口的引用类型变量,并创建子类的对象。

img331

img332

其次,通过子类引用值转换成父类类型,可将一个引用类型变量指向不同类型的子类对象。这样,子类对象可以作为父类对象来使用。

img333

这条语句说明,将圆类对象的引用值自动转换成Shape父类类型后,此时Shape类变量obj实际引用(指向或代表)圆类Circle的对象,或者说,此时的圆类对象被视作图形类对象来使用。

同理,语句obj=o2;说明,此时Shape类变量obj实际引用三角形类Rectangle的对象,或者说,此时的矩形类对象被视作图形类对象来使用;语句obj=o3;说明,此时Shape类变量obj实际引用三角形类Triangle的对象,或者说,此时的三角形类对象被视作图形类对象来使用。

子类对象可以作为父类对象来使用,只能使用父类所具有的成员变量和成员方法。这是由于此时子类对象的引用值类型变成了父类类型。

最后,通过父类引用类型变量,调用父类的抽象方法,进行动态绑定,实现多态。

将一个方法调用同一个方法主体连到一起就称“绑定”。根据绑定的时机不同,可将绑定分为静态绑定和动态绑定。

在程序编译期间,即程序运行前执行的绑定,称为静态绑定。

在程序运行期间执行的绑定,称为动态绑定或运行时绑定。

对于一个引用型变量,在编译期间编译器按照它声明的类型进行检查处理,而在运行期间,Java虚拟机采用如下绑定规则:实例方法与引用类型变量实际引用对象的方法绑定。

img334

这两条语句说明,既然此时Shape类变量obj实际引用(指向或代表)圆类Circle的对象,那么,display()方法就与圆类Circle的对象“绑定”在一起,执行圆类的display()方法。

此外,这两条语句可合成一条语句Shape obj=new Circle();。

小结 引用类型变量实现多态,应完成下列工作:

(1)存在着父子关系的引用类型变量和对象;

(2)将子类对象引用值转换成父类类型;

(3)通过父类引用类型变量,调用父类的抽象方法,进行动态绑定,实现多态。

引用类型变量常在引用类型转换、引用类型作参数和引用类型作类的成员变量(引用类型的组合)的场合下实现多态。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈