Следующее работает из-за принципа подстановки (Лисков), который гласит, что если ожидается ссылка на экземпляр определенного класса, то вы можете заменить ссылку на экземпляр любого подкласса этого класса.
public static void main( String[] args ) {
Cat felix = new Cat( );
Object copyCat = felix;
}
Теперь, насколько я понимаю, в этом случае я создаю объект Cat
(поэтому в куче создается пространство памяти), затем я присваиваю вновь созданному объекту Cat
переменную ссылки на объект с именем "felix". Ссылочная переменная имеет тип Cat
, поэтому может управлять только Cat
и любыми подклассами Cat
.
Затем я создаю ссылочную переменную Object
типа Object
и указываю ее на объект felix (Cat
), который работает, но с ограниченной функциональностью, поскольку JVM теперь видит объект felix типа Object
, поэтому, если, например, был метод purr()
, определенный в классе Cat
, Феликс больше не сможет его использовать.
Таким образом, ожидается ссылка типа Cat
, но мы предоставляем ссылку на суперкласс типа cat (а не на подкласс, как сказано в определении выше), и это разрешено, но с ограниченной функциональностью (если вы не сделаете В ролях).
Я прав или отклоняюсь?
felix
еще может мурлыкать, аcopyCat
нет. Память не меняется, но разные типы сообщают компилятору, как смотреть на этот участок памяти. - person DarkDust   schedule 19.04.2011