наследование в ошибке Java, кажется интуитивно задом наперед - PullRequest
0 голосов
/ 04 ноября 2018

Саб расширяет сэндвич. Так что я понимаю, что «Sub» - это «Сэндвич, но Sandwich» - это не «Sub. Правильно?

Так почему же тогда y=x (по существу sub равно sandwich) выдает ошибку, но x=y (sub равно sandwich) работает?

public class Sandwich {

    public static void main(String[] args) {
        Sandwich x = new Sandwich();
        Sub y = new Sub();
        y=x;
    }

}

вот класс Sub:

public class Sub extends Sandwich {}

Ответы [ 4 ]

0 голосов
/ 04 ноября 2018

Вы должны рассматривать класс Sub как нечто более функциональное, чем класс Sandwich, потому что Sub расширяет Sandwich. То есть, если класс Sub объявлял новый метод и y=x; был скомпилирован без ошибки, как вы могли бы вызвать y.newMethod(), когда у этого объекта просто его нет? Вот почему назначение y=x; в вашем коде не может быть скомпилировано.

0 голосов
/ 04 ноября 2018

y=x означает «у меня есть бутерброд, пожалуйста, относитесь к нему как к сабле», который не работает, если у меня есть панини.

x=y означает «У меня есть саб, пожалуйста, относитесь к нему как к сэндвичу», что не проблема.

0 голосов
/ 04 ноября 2018

Ответ - ваш собственный вопрос.

я понимаю, что Sub "- это" Сэндвич, но Sandwich "- это не" Sub.

Sub "это" сэндвич
Это означает, что вы можете рассматривать y (Sub-объект) как Sandwich и ссылаться на него с помощью переменной Sandwich: x = y (поскольку Sub является Sandwish)

Бутерброд "не является" Sub
С другой стороны, вы не можете рассматривать x (объект Sandwish) как Sub и не можете ссылаться на него с помощью переменной Sub: y = x ERROR (потому что Sandwish не является Sub)

Я надеюсь помочь вам.

0 голосов
/ 04 ноября 2018

Sandwich является более общим типом, чем Sub тип. Sub более специфичный тип, чем Sandwich. Подкласс имеет больше функций в дополнение к функциям родительского класса.

Parent = Sub x = y

Вы можете назначить ссылку на подкласс для ссылки на родительский класс и это около polymorphism. Каждый sub является sandwich. Потому что интерфейс родительского класса поддерживает интерфейс подкласса.

Но вы не можете назначить ссылку на родительский класс для ссылки на подкласс. Потому что тип Sub более специфичен, чем тип Sandwich, и каждый сэндвич не является Sub.

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