Полиморфизм обеспечивает способ отделить низкоуровневые детали от основного потока программы, ограничивая детали к подклассам, в то время как программа знает только о классах более высокого уровня. Полиморфизм позволяет программе работать в терминах обобщений.
Чтобы расширить пример немного мы бы
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();
}
}
}
Здесь программа Demo может пробежать список животных без внесения каких-либо особых случаев, для которых животные являются собакой, и которая одна кошка. Это означает, что я могу добавить новые подклассы Animal, и содержимое for-loop никогда не должно меняться.
Если бы не было полиморфизма код будет выглядеть
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 должно знать намного больше о деталях. Каждый новый вид животных будет необходим для добавления к телу.
Возможный дубликат [Польза полиморфизма] (http://stackoverflow.com/questions/11082640/benefit-of-polymorphism) – jdphenix
Близко связанный: [Что означает «программировать интерфейс»?] (Http : //stackoverflow.com/q/383947/1065197) –