2016-06-25 7 views
-4

Имея следующую иерархию классов:Иерархия классов JAVA: какая из следующих строк не будет компилироваться?

Interface Animal {…} 
class Dog implements Animal{…} 
class Poodle extends Dog {…} 
class Labrador extends Dog {…} 

Какие из следующих строк не будет собирать?

Poodle poodle = new Poodle(); //1 
Animal animal = (Animal) poodle; //2 
Dog dog = new Labrador(); //3 
animal = dog; //4 
poodle = dog; //5 
Animal labrador = new Labrador(); //6 
Dog dog2 = new Labrador(); //7 
dog 2=labrador;//8 

Я думаю, что линия 5: из-за статического связывания пуделя и собаки.

Строка 8: для назначения присваивается только статическая привязка.

Я прав? Можете ли вы дать объяснение?

+0

Точка инструктора, задающая вам этот вопрос, предназначена для ** вы **, чтобы ответить на него, основываясь на исследованиях. Попросить других людей ответить на него за вас - это не исследование. Даже если вы публикуете свой собственный частичный ответ. –

+0

для проверки теста – student

+0

Чтобы добавить комментарий к TJ, вы можете попробовать скомпилировать код, а затем посмотреть, что происходит, и какая ошибка вы получаете. –

ответ

0

Вы правы, заявления 5 и 8 будут терпеть неудачу.

5> Вы не можете назначить объект родительского класса для переменной ref-типа дочернего класса. Пудель - определенно собака. Но собака не может быть пуделем.

8> То же самое относится и к линии 8. Это, однако, было бы в порядке: dog2= (Dog)labrador;

Примечание: Явное приведение типов, сделанное в строке 8, будет в порядке, поскольку лабрадор является объектом Лабрадора, который также является подклассом Dog. Если вы попытаетесь сделать то же самое в случае (5), как

poodle = (Poodle)dog; 

было бы составить, но потерпит неудачу во время выполнения - из-за той простой причине, - dog относится к Лабрадора. dog.getClass() вернется Labrador.class. Для того, чтобы этот объект ссылался на любой ref, ref должен быть ссылкой на класс/интерфейс, который принадлежит иерархии вверх исходного класса объекта. Лабрадор, хотя и является собакой, определенно не пудель.

Кроме того, явное приведение типов является строкой 2, не очень полезно, так как это делается неявно. Ниже приведена явная директива типа:

+0

Почему литье не поможет с линией 5? – student

+0

Добавлены некоторые изменения. Это должно помочь вам. Зачем кому-то завышать мой ответ? : P У каждого есть смирение, чтобы добавить комментарий, если вы это делаете. –

+0

Спасибо! Что означает «ref»? – student