Скажем, у меня есть суперкласс «Рыба» и подкласс «Туна». Я не понимаю, почему это работает:Смутно об обход иерархии классов с полиморфизмом
Fish f;
Tuna t = new Tuna();
f=t; // I am confused about this statement
f.swim(); // (Tuna's swim method is invoked)
Почему переменная рыба разрешается «принимать участие в» (за неимением лучшего выражения) более специализированного объекта тунцом? Способ, которым мой явно ошибочный «мозг noob OOP Java» работает:
Тунец «это рыба». Рыба "является" Тунец не в порядке. Поэтому f = t не должно быть ОК, а t = f должно быть в порядке. Но из моего примера выше обратное верно!
Большое спасибо за любую помощь по этому вопросу. Я заранее извиняюсь за свое невежество, поскольку я только начал изучать Java.
Редактировать. Большое спасибо за все ответы ниже. Из них я теперь понимаю, что:
Переменная, называемая f, имеет тип Fish, и поэтому разрешено содержать значение данных (ссылку на объект), расположенную внутри переменной t, поскольку t относится к объекту тунца , и поэтому является совместимым типом для использования f. Это совместимо, потому что тунцом является рыба.
Строки не умеют плавать? О, МОЙ БОГ! Я был просвещен! –
Спасибо! Я отредактировал свой O.P., чтобы отразить то, что я узнал. – user2911290