ООП: upcast против прямой реализации - PullRequest
2 голосов
/ 02 марта 2011

Я готовлюсь к SCJP и, похоже, я не понимаю принципы каста классов.

class Dog extends Animal

Первый способ создания Dog() экземпляра - создание экземпляра Animal и приведение его к собаке (upcast):

Animal a = new Dog();
Dog d1 = (Dog)a;

VS

Второй способ создания Dog() экземпляра - сделать его напрямую:

Dog d2 = new Dog();

В чем разница между d1 и d2 объекты в этом случае?

Ответы [ 4 ]

3 голосов
/ 02 марта 2011

После приведения от a к Dog нет никакой разницы между d1 и d2.Актерский состав потенциально проблематичен.Если a на самом деле не Dog, вы получите ClassCastException во время выполнения.Поэтому вам лучше проверить тип среды выполнения с помощью instanceof:

Animal a = new Dog();
Dog d1 = null;
if(a instanceof Dog)
{
    d1 = (Dog)a;
}

Реальная проблема заключается в том, что если вам нужен Dog, объявите переменную как Dog, а не Animal.Если вы работаете с любым типом Animal, используйте базовый класс.

Тип переменной определяет только то, какой интерфейс вы хотите использовать - будь то интерфейс, предоставленный базовым классом,реализация некоторого класса или фактическая interface.Тип переменной не определяет ее тип во время выполнения.

2 голосов
/ 02 марта 2011

Первый способ полиморфен, потому что Животное может быть собакой, кошкой, слоном и т. Д., Тогда как последний способ - нет. В противном случае нет большой разницы между 2.

2 голосов
/ 02 марта 2011
Animal a = new Dog();// a dog is created but it will be referred by reference of animal as dog is an animal
Dog d1 = (Dog)a;//now we know that this animal is Dog so we are casting it to dog.

Dog d2 = new Dog();// we are creating instance of dog which is referred by reference of Dog

В чем разница между объектами d1 и d2 в этом случае?

d1 и d2 являются просто ссылками на собаку, оба в конечном итоге ссылаются на экземпляр Dog нет разницы

См. Также

1 голос
/ 02 марта 2011

Нет никакой разницы в экземпляре между этими фрагментами: в обоих случаях вы создаете экземпляр объекта типа Dog с помощью new Dog().На самом деле речь идет о разнице между типом объекта (тип времени выполнения) и типом переменной (статический тип).

Но в первом случае вы присваиваете ссылку на этот объект переменной типа Animal, а затемприсвойте значение этой переменной другой переменной типа Dog.Это требует приведения, поскольку переменная типа Animal может содержать ссылки на объекты типов, отличных от Dog, но в вашем случае она ссылается на объект типа Dog, так что приведение выполняется успешно.

Вво втором случае вы присваиваете значение типа Dog непосредственно переменной типа Dog.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...