Разница между явным понижением и повышением

Если у меня есть следующая ситуация, где я определяю класс 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();
    }
}
Другие вопросы по тегам