java温习*(11):向上转型和动态绑定机制

多态的实现可以借由向上转型和动态绑定机制来完成,其中,向上转型实现了将子类对象向上转型为父类类型;而动态绑定机制能识别出对象转型前的类型,从而自动调用该类的方法,两者相辅相成。在本节中,我们将从多角度总结,向上转型与动态绑定机制的特点和注意事项。

语法:

  • 向上转型

又称为自动转型、隐式转型。即是父类引用指向子类实例,也表示子类的对象可以赋值给父类的对象。向上转型是安全的,因为任何子类都继承并接受了父类的非私有成员方法。

  • 绑定机制

绑定就是将一个方法调用同一个方法所在的类连接到一起。Java中存在静态绑定和动态绑定两种。

其中,静态绑定是指在程序运行之前进行绑定(由编译器和链接程序完成的),也叫做前期绑定。 动态绑定则是指在程序运行期间由 JVM 根据对象的类型自动的判断应该调用哪个方法,也叫做后期绑定。

应用:

- 向上转型

当一个子类对象向上转型父类类型以后,就被当成了父类的对象,所能调用的方法会减少,只能调用子类重写了父类的方法以及父类派生的方法,而不能调用子类独有的方法。

譬如:图(1)所示Pencil继承自Pen,经过图(2)完成向上转型后,图(3)的方法调用会报错:The method show() is undefined for the type Pen,即无法调用不属于Pen的show方法。

图片描述

(图1)

图片描述

(图2)

图片描述

(图3)

  • 绑定机制

静态绑定的示例:

譬如:有一类 Human,它派生出来三个子类 Chinese 类、American 类和 British类,三个子类中都重写了父类中的方法 speak( ):void。

如下图所示,在测试类中用静态绑定的方式调用方法 speak( )。这种调用方式是在代码里指定的,编译时编译器就知道 c 调用的是 Chinese 的 speak( ),a 调用的是 American 的 speak( )。

图片描述

动态绑定的示例:

如果此时我们在测试类中做以下改动:Human 类中随机生成 Chinese 类、American 类和 British 类的对象,则编译器将不能根据代码直接确定调用哪个类中的 speak( )方法,直到运行时才能根据产生的随机数 n 的 值来确定 human[i]到底代表哪一个子类的对象,这样才能最终确定调用的是哪个类中的 speak( )方法,这就是动态绑定。

图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章