![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
Thor_75t |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 23.9.2007 Репутация: нет Всего: нет |
Извиняюсь за возможно неверное расположение материала, но меня мучает незнание ответа, а тут насколько вижу рассматриваются как раз задачки и даются ответы. Надеюсь что мне подскажут
![]() Ситуация следующая- имею такой код:
Результат работы на консоли- Bz.constr()Bt.constr()B.constr()Bz.constr()Bt.constr()B.constr()B1.constr() Bz Почему срабатывает метод getB объекта Bz?? В ссылочной переменной b экземпляра a хранится ссылка на B1. Следовательно должен вызываться метод, ассоциированный с типом хранящегося экземпляра B1, т.е. вызывается переопределённый метод getB внутри объекта B1(родной вызов getB в BZ отбрасываем, т.к. он содержит ссылочный параметр Bz). Не могу понять что я не понимаю ![]() С уважением Тор. С нетерпением буду ждать ответа (пусть даже и с подковыркой, быть может для профи мой лёгкий вопрос будет смешным ![]() Это сообщение отредактировал(а) Thor_75t - 30.9.2009, 21:34 |
|||
|
||||
revenforv |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 47 Регистрация: 6.8.2009 Где: Санкт-Петербург Репутация: нет Всего: нет |
А мысль в том, что методы, которые вы считаете виртуальными - таковыми не являются:
1: getB(B bbb) в Bz 2: getB(Bz bbb) в Bt 3: getB(Bt bbb) в B 4: getB(Bt bbb) в B1 Виртуальный здесь только метод 3 и его переопределенная версия 4. Согласно спецификации языка, поиск нужного метода осуществляется так. Вначале определяется стартовая точка поиска. Поскольку вызов типа virtual - поиск начинается с класса B1 (runtime type) В поиске участвует класс Bz - это compile time type В начале проверяется, есть ли совместимый с get(null) метод в B1 (он есть), далее т.к. вызов виртуальный, то проверяется - переопределяет ли этот метод метод Bz.getB(B bbb) (не переопределяет, т.к. сигнатуры не совпадают). Поскольку в B1 метод не найден - поиск продолжается в его суперклассе, т.е. в B. Затем по той же причине в Bt и, наконец, в Bz. Для того чтобы таких досадных ошибок и непоняток не возникало в JDK1.5 была введена аннотация @Override, если бы вы воспользовались ею при написании метода getB(), то ошибка компиляции возникла бы уже в классе Bt Это сообщение отредактировал(а) revenforv - 30.9.2009, 21:14 |
|||
|
||||
Thor_75t |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 23.9.2007 Репутация: нет Всего: нет |
Спасибо revenforv
![]() Сейчас прогоню на компиляторе, чтоб освоить, укрепить и перестать наконец путаться в основах ![]() Насчёт @Override - интересно, но, думаю- что лучше полагаться на себя, чем на помощь дружественных методов ![]() Это сообщение отредактировал(а) Thor_75t - 30.9.2009, 21:46 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |