Наследование Java - PullRequest
       5

Наследование Java

0 голосов
/ 07 мая 2011

В классе C есть метод v без параметров.Другой класс D расширяет C и переопределяет m.У каждого класса есть конструктор без параметров.В каждом из следующих действий укажите, является ли это законным, и если да, то какое определение m будет использоваться.1008 * Я думаю, что я легален, и я не легален.Не уверен, как я обдумываю этот вопрос, любые советы приветствуются.

Ответы [ 4 ]

2 голосов
/ 07 мая 2011

Лучший способ ответить на вопрос - написать код и посмотреть, что произойдет.Используйте System.out.println("method called from C"); в вашей реализации m, чтобы сказать, какая реализация вызывается.Сказав это, весь смысл переопределения метода заключается в том, что новая реализация будет использоваться.Если ваш объект имеет тип C, будет вызван метод C s.Если ваш объект имеет тип D, то метод D s будет вызван независимо от типа ссылки.

Первый ответ:

C x = new D();

допустим, потому что и объекттипа D также является C (поскольку D расширяется C).

Второй ответ:

D x = new C();

равен не допустимо, поскольку ссылка на D не может содержать объект своего супертипа C.

1 голос
/ 07 мая 2011

Попытайтесь думать о наследовании в терминах отношений "есть".

Если D extends C, то это означает, что каждый D является C, но не означает, что каждый C является D.

Чтобы применить это мышление, переведите вопрос в вопрос "есть".

C x = new D()

- это утверждение, которое требует, чтобы new D() был C.

В String s = new Object() спросите себя "это new Object() a String?" А как же наоборот?

Удачи в изучении ООП.

1 голос
/ 07 мая 2011

Да, вы правы.

(i) допустим, и будет запущен метод D m (это называется полиморфизм ).

(ii) является недопустимым и даже не будет компилироваться, потому что D не является супертипом C (на самом деле это подтип). Мы можем скомпилировать его, написав его так:

D x = (D) new C(); x.m();

но тогда он потерпит неудачу во время выполнения с ClassCastException

0 голосов
/ 07 мая 2011

i) законно, ii) нет.Это очень легко увидеть, если вы используете метафору, скажем, класс C - это Animal, а класс D - это Dog, метод m () - это makeNoise.Теперь допустимо иметь переменную класса Animal и присвоить ей Dog (потому что собака «является» животным), но не разрешено создавать экземпляр Animal и присваивать его Dog, поскольку Dog более специфичен, чем Animal (мынельзя сказать, что животное "является" собакой).

Теперь о методе: метод всегда вызывается по типу времени выполнения, а не по типу переменной (все вызовы методов являются так называемыми виртуальными в Java)поэтому в случае i) он вызывает метод m () класса D, а не класса C.

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