В этой строке вы заявляете, что sameObjectDifferentType
имеет тип Rectangle
Rectangle sameObjectDifferentType = blueRectangle;
В более реальных примерах это позволит вам иметь несколько различных типов, которые вы хотели бы обрабатывать одинаково. Классический пример - CurrentAccount
, CheckingAccount
, SavingsAccount
, которые все наследуются от Account
.
Предположим, в вашем банковском приложении был код для поиска учетной записи и выяснения владельца учетной записи. Этот код будет иметь дело только с абстрактными типами Account
. Это означает, что в будущем, когда вы введете StudentAccount
, при условии, что он наследует от Account
, вы можете использовать StudentAccount
во всех местах, где вы в настоящее время имеете дело с Account
s, без изменения кода.
Предположим, у вас есть FilledRectangle
и WireFrameRegtangle
в вашем примере. У вас может быть метод calculateArea(Rectangle rect)
, который будет применяться ко всем прямоугольникам.
Тем не менее, один компромисс, который вы делаете для этой мощи и гибкости, заключается в том, что вы теряете возможность напрямую работать со свойствами подкласса, когда объявляете объект типом суперкласса, поэтому
sameObjectDifferentType.getColor(); //Won't compile
Тем не менее, Java дает вам возможность вернуться к подклассу, как вы заметили, приведя:
((ColoredRectangle) sameObjectDifferentType).getColor(); //Will compile
Вы, как разработчик, знаете, что sameObjectDifferentType
- это на самом деле ColoredRectangle
под капотом, так что вы можете сделать этот бросок. Однако, если вы сделали
((FilledRectangle) sameObjectDifferentType).getFillPattern();
В результате вы получите ClassCastException во время выполнения
Надеюсь, это поможет.