Animal myAnimal1 = new Dog();
Animal myAnimal2 = new Cat();
Animal myAnimal3 = new Horse();
Предположим, у Animal есть метод с именем getAnimalSound () , и Dog, Cat, Horse все переопределяют этот метод в соответствии с ними. Теперь этот код очень расширяем, у вашего API может быть только один метод getAnimalSound () для указания звука любого вида животного, в крачке каждый класс животных уже реализовал свою собственную версию getAnimalSound ()
System.out.println(getAnimalSound(myAnimal1)); //runtime finds animal1 is dog, prints Bark
System.out.println(getAnimalSound(myAnimal2));//runtime finds animal2 is cat, prints Meow
System.out.println(getAnimalSound(myAnimal3));//runtime finds animal3 is horse, prints Niih
Как вы можете видеть, один метод getAnimalSound () является стандартным API, но мы достигли такой степени расширяемости.