Идея в том, что вам не нужно заботиться о том, с какой формой вы имеете дело. Например, если Shape определяет абстрактный метод draw (), то треугольники, квадраты и все, что расширяет Shape, также будут иметь тот же метод.
Простым определением полиморфизма является «обработка разных типов, как если бы они были одинаковыми», то есть использование одного и того же интерфейса.
В идеальном мире нам не нужно беспокоиться о том, с каким конкретным типом объекта мы имеем дело, только интерфейс более общего типа, который охватывает все сценарии использования в его интерфейсе.
Shape p1 = new Square();
Shape p2 = new Triangle();
p1.draw();
p2.draw();
В этом коде мы напрямую вызываем Shape.draw () для p1 и p2. Нам не важно, что делает класс реализации, только то, что определено интерфейсом (или абстрактным родительским классом).
Редактировать: Что касается примера в вопросе, как правило, рекомендуется избегать такого рода шаблон кода, инкапсулируя поведение, где это возможно. Использование instanceof может рассматриваться как запах кода, так как вам придется обновлять все ваши условия при каждом добавлении нового класса.