java一个实例对象只能被一个变量引用_引用类型变量是如何实现多态的_Java语言程...

引用类型变量是如何实现多态的_Java语言程

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

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

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

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

784be3016bb78d3a77a3dfc11464bd01.png

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

cf2bb9f7ddd94e4b0bc6fd4af4bc7d95.png

14b12a50a3189d7b228f40d8b36fe949.png

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

b15f55d96a4881ea804b7a242be03f88.png

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

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

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

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

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

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

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

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

dbfe96f78a5e9c27822899f2aa06d0df.png

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

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

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

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

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

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

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

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页