Объявление объекта класса наследника

В кратце. Например у нас есть суперкласс "Cat", и его наследник "smallCat". object это название объекта

Чтоб объявить объект класса наследника smallCat мы обычно пишем: smallCat object = new SmallCat();

Но есть такая вариация объявления объекта которую я не могу понять: Cat object = new SmallCat();

Можете пожалуйста объяснить вторую вариацию и чем она отличается от первой вариаций.

Буду благодарен!


Ответы (2 шт):

Автор решения: Aziz Umarov

Преобразование из подкласса в суперкласс называется upcasting оно как правило выполняется неявно. Есть и downcasting преобразование из суперкласса в подкласс. Подробнее почитайте тут

По второму вопросу, разница. По сути это переменные содержащие в себе ссылку на объект SmallCat. Только в первом случае это ссылка типа SmallCat а во втором Cat. Если представить class неким лекалом над адресном пространством. То наведя лекало Cat на область созданную конструктором SmallCat мы увидим кошку(Cat) так как он его суперкласс.

→ Ссылка
Автор решения: Alexey R.

Второй вариант представляет собой пример полиморфизма в Java.

У Вас есть кот и маленький кот. Маленький кот - это всё еще кот, ему присущи свойства кота. Если Вы пишете какой-то метод, который работает с котами - без разницы какими - Вы можете указать кота как входящий параметр.

Т.к. как код Вашего метода работает только с видимыми полями и методами, то с маленькими котами он тоже будет работать, потому что маленькие коты наследуют свойства котов.

В итоге, Вы можете обращаться к любым подвидам котов, используя ссылку на класс-родитель (это удобно в случаях, которые я описал выше). Ограничение состоит в том, что Вы не сможете через такую ссылку получить доступ к методам и полям специфичным именно для маленьких котов. Если такая необходимость всё же встанет, придется проверять объект на соотв-ие конкретному классу и приводить его явно.

→ Ссылка