Объявление объекта класса наследника
В кратце. Например у нас есть суперкласс "Cat", и его наследник "smallCat". object это название объекта
Чтоб объявить объект класса наследника smallCat мы обычно пишем: smallCat object = new SmallCat();
Но есть такая вариация объявления объекта которую я не могу понять: Cat object = new SmallCat();
Можете пожалуйста объяснить вторую вариацию и чем она отличается от первой вариаций.
Буду благодарен!
Ответы (2 шт):
Преобразование из подкласса в суперкласс называется upcasting оно как правило выполняется неявно. Есть и downcasting преобразование из суперкласса в подкласс. Подробнее почитайте тут
По второму вопросу, разница. По сути это переменные содержащие в себе ссылку на объект SmallCat. Только в первом случае это ссылка типа SmallCat а во втором Cat. Если представить class неким лекалом над адресном пространством. То наведя лекало Cat на область созданную конструктором SmallCat мы увидим кошку(Cat) так как он его суперкласс.
Второй вариант представляет собой пример полиморфизма в Java.
У Вас есть кот и маленький кот. Маленький кот - это всё еще кот, ему присущи свойства кота. Если Вы пишете какой-то метод, который работает с котами - без разницы какими - Вы можете указать кота как входящий параметр.
Т.к. как код Вашего метода работает только с видимыми полями и методами, то с маленькими котами он тоже будет работать, потому что маленькие коты наследуют свойства котов.
В итоге, Вы можете обращаться к любым подвидам котов, используя ссылку на класс-родитель (это удобно в случаях, которые я описал выше). Ограничение состоит в том, что Вы не сможете через такую ссылку получить доступ к методам и полям специфичным именно для маленьких котов. Если такая необходимость всё же встанет, придется проверять объект на соотв-ие конкретному классу и приводить его явно.