我对多态性有一个很好的理解,但我的问题是,例如,在我下面发布的代码中,在使用动物类型变量时能够制作Cat的对象有什么特别之处。这有什么用途?还假设makenoise方法在每个对象拥有的类中被覆盖,并且所有其他类继承的类是动物类。
public class Demo
{
public static void main(String[] args) {
Animal a1 = new Cat(); //prints meow
a1.makeNoise();
Animal a2 = new Dog();
a2.makeNoise(); //Prints Bark
}
}
答案 0 :(得分:1)
多态性提供了一种通过将细节限制为子类来将低级细节与程序主流分离的方法,而程序只知道更高级别的类。多态性使程序在泛化方面起作用。
为了扩展你的例子我们有一点
abstract class Animal {
public abstract void makeNoise();
}
class Cat extends Animal {
public void makeNoise() { System.out.println("meow");}
}
class Dog extends Animal {
public void makeNoise() { System.out.println("woof");}
}
class Demo {
public static void main(String[] args) {
List<Animal> animals = new ArrayList<Animal>();
animals.add(new Cat());
animals.add(new Dog());
for (Animal animal: animals) {
animal.makeNoise();
}
}
}
这里的演示程序可以在动物列表中运行而不会产生任何特殊情况,其中动物是狗,哪一只是猫。这意味着我可以添加Animal的新子类,并且for循环内容永远不必更改。
如果不是多态,则代码看起来像
class Dog {
public void bark() {System.out.println("woof");}
}
class Cat {
public void meow() {System.out.println("meow");}
}
class Demo {
public static void main(String[] args) {
ArrayList<Object> animals = new ArrayList<Object>();
animals.add(new Cat());
animals.add(new Dog());
for (Object animal: animals) {
if (animal instanceof Dog) {
((Dog)animal).bark();
} else if (animal instanceof Cat) {
((Cat)animal).meow();
}
}
}
}
现在,该程序可以使用的动物类没有共性。没有任何有用的概括使用Demo必须更多地了解细节。引入的每种新动物都需要添加到循环体内。