一、多态性
多态性:多态性的核心是“多种形式”。在Java中,多态性是指对象如何具有多种形式或类型。在面向对象的编程中,多态与如何将一个对象视为其自己的类的实例,其超类的实例,其超类的超类的实例等相关。
(我的理解是:与动态方法选择有关,为一个父类型对象赋值为各种子类型对象,该对象在调用方法的时候,会根据动态类型来选择override或非override的不同方法,这样就可以通过一个对象的多态性特征完成不同的行为。)
继承使使用多态性设计通用数据结构和方法成为可能。
如何使用继承和多态性实现设计通用的数据结构和方法呢?
二、以“比较”为例
以“比较”方法为例,说明如何使用继承和多态性实现设计通用的数据结构和方法。
假设我们要编写一个max函数,该函数可以接收任何数组(无论类型如何)并返回数组中的最大项。
1. 最垃圾的方法
目的是让体型最大的狗叫。所以就写一个maxDog方法,接收Dog[],比较出其中size最大的dog,并将其返回。
public static Dog maxDog(Dog[] dogs) {
if (dogs == null || dogs.length == 0) {
return null;
}
Dog maxDog = dogs[0];
for (Dog d : dogs) {
if (d.size > maxDog.size) {
maxDog = d;
}
}
return maxDog;
}
public static void main(String[] args) {
Dog[] dogs = {
new Dog("Elyse", 3), new Dog("Sture", 9), new Dog("Benjamin", 15)};
Dog maxDog = (Dog) maxDog(dogs);
maxDog.bark();
}
缺陷:
- 如果要比较任何其他东西,都要写一个新方法,如maxDuck(Duck[] Ducks), maxCat(Cat[] Cat)。除此之外还需要修改main函数中的函数调用。造成大量冗余代码。
- 如果希望按照其他方式排序dog,如按照dog名字的字母顺序,都要重新写方法,并修改main函数中的调用。
2. OurComparable
关键是要有一个通用的比较两个对象的方法。
我们可以创建一个接口,以确保任何实现类(如Dog)都包含一个比较方法,我们将其称为compareTo。