Разница между явным понижением и повышением
Если у меня есть следующая ситуация, где я определяю класс Animal и другой класс Dog, который расширяет Animal следующими двумя строками кода:
1) собака d = (собака) new Animal(); // явное опущение
2) животное = новая собака (); // автоматический upcast
Каковы плюсы и минусы определения двух животных таким образом? В частности, в каких ситуациях я бы предпочел (1), а не (2) и наоборот?
Из того, что я понимаю, мы удручены, чтобы иметь доступ к методам Пса, но тогда почему бы просто не назвать это собакой?
Заранее спасибо!
1 ответ
Похоже, вы заинтересованы в том, чтобы больше узнать об апскейтинге и спуске, и в этом случае вам может пригодиться этот ответ.
Чтобы немного расширить ваши вопросы и извлечь из связанного ответа, обновление всегда разрешено, но снижение включает проверку типа, которая может бросить ClassCastException
,
Тем не менее, вы можете использовать оператор instanceof для проверки типа объекта во время выполнения перед выполнением приведения, что позволяет вам предотвратить такие исключения, как в приведенном ниже коде.
Одна из причин, по которой вы можете отказаться от участия, заключается в том, что вы хотите, чтобы метод работал для всех животных, но он должен делать что-то особенное для собаки, что может привести к такому коду:
public void pet(Animal animal) {
// Do something else if animal is a Dog
if (animal instanceof Dog) {
Dog dog = (Dog) animal;
dog.growl();
}
}