Проблемы с типом ссылки на объект (динамическое связывание)? - PullRequest
0 голосов
/ 12 ноября 2011

В основном у меня небольшая проблема.

У меня есть суперкласс и подкласс.Я должен сделать назначение, где я выполняю метод из подкласса, который переопределяет метод из суперкласса.Это отлично работает.У меня проблема с «динамическим связыванием».Когда я объявляю тип ссылочной переменной того же класса, что и подкласс, он работает нормально.Однако, когда я объявляю тип как принадлежащий суперклассу, он не распознает ни один из методов подкласса, чтобы даже существовать.

Вот пример.У меня есть класс с именем Ship и другой подкласс Ship с именем BabyShip

Если я объявлю ссылку на ShippyShip как:

BabyShip subref = new BabyShip();  

Это прекрасно работает.Однако, когда я объявляю это как:

Ship subref = new BabyShip();

Компилятор даже не распознает ни один из методов BabyShip, если я объявляю тип subref как Ship ... но моя книга ясно говорит, что этодолжен.Почему он это делает?

Это дает обычную ошибку не удается найти символ, когда я его компилирую.

ShipTester.java:8: error: cannot find symbol
            ship.setMaxPassengers(1);
                ^
  symbol:   method setMaxPassengers(int)
  location: variable ship of type Ship
1 error

1 Ответ

2 голосов
/ 12 ноября 2011

Вы уверены, что не неправильно прочитали книгу? Java не делает динамическое связывание, как это. Если setMaxPassengers является только , объявленным в BabyShip, то компилятор делает все правильно. Вы можете получить доступ только к членам, которые известны типу выражения во время компиляции, через которое вы обращаетесь к ним - в этом случае ship имеет тип Ship, поэтому только члены Ship (и его суперклассы) доступны.

Трудно точно понять, в чем проблема, не зная точно, что говорится в книге. Единственный вид динамического связывания, который происходит в обычной Java, - это переопределение - если вы объявили setMaxPassengers в Ship, но затем переопределили в BabyShip, тогда переопределенный метод будет вызван в время исполнения.

Java 7 имеет некоторые новые функции, когда речь заходит о динамическом связывании, но это не похоже на то, о чем вы здесь говорите.

Если вы можете процитировать конкретную часть книги, которая, по вашему мнению, должна работать, пожалуйста, сделайте это.

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