![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| v2v |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1620 Регистрация: 20.9.2006 Где: Киев Репутация: 8 Всего: 56 |
Нашёл пример немного изменил получилось:
Интересный, скажу я вам, получается результат. Кто то может (не запуская!) сказать, что произойдёт после запуска этого приложения!? И объяснить свою версию... Меня результат вогнал в ступор. Это сообщение отредактировал(а) v2v - 4.9.2007, 17:09 |
|||
|
||||
| goodday1941 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 709 Регистрация: 16.7.2006 Где: Украина, Киев Репутация: 1 Всего: 9 |
Instrument1 play
так как flute = new Instrument1(); соответственно и метод мы вызвали с класса Instrument1 Добавлено через 2 минуты и 38 секунд ну и еще static void tune(Instrument i) статический, значит метод play класса Instrument он принципиально вызвать не может -------------------- SCJP 6 |
|||
|
||||
| v2v |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1620 Регистрация: 20.9.2006 Где: Киев Репутация: 8 Всего: 56 |
а как же преобразование к базовому типу?
Добавлено через 2 минуты и 19 секунд
на самом деле может, но как такое происходит что при приведении типов, данные из дочернего типа остаются? |
|||
|
||||
| goodday1941 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 709 Регистрация: 16.7.2006 Где: Украина, Киев Репутация: 1 Всего: 9 |
вообще да может.. ступил малек )
в общем то оценил всю ситуацию.. терь сам не понимаю )) -------------------- SCJP 6 |
|||
|
||||
| powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 47 Всего: 159 |
||||
|
||||
| shimopus |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 25.8.2006 Репутация: 1 Всего: 1 |
||||
|
||||
| v2v |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1620 Регистрация: 20.9.2006 Где: Киев Репутация: 8 Всего: 56 |
static void tune(Instrument i) Добавлено через 3 минуты и 49 секунд а при чём тут он? |
|||
|
||||
| Maksym |
|
|||
![]() . ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1456 Регистрация: 19.8.2005 Где: Odessa, Black Sea Репутация: 14 Всего: 62 |
Народ вы чего? Создали экземпляр Instrument1. От того что его откастили к базовому классу значение ссылки на объект не поменялось, новый объект никто не создавал, работаем все с тем же экземпляром Instrument1. В котором метод переопределен.
|
|||
|
||||
| powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 47 Всего: 159 |
Притом, что вызов метода зависит не от типа ссылки, а от типа объекта, на который эта ссылка указывает. Это как бы и есть полиморфизм. |
|||
|
||||
| v2v |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1620 Регистрация: 20.9.2006 Где: Киев Репутация: 8 Всего: 56 |
значит upcasting это всего лишь изменение некоторого скрытого поля className и никакого удаления лишних меотодов, объектов из класса ...
Добавлено через 1 минуту и 14 секунд всё. понял. спасибо за помощь |
|||
|
||||
| AxNe0 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 24.4.2006 Где: St. Petersburg Репутация: 4 Всего: 5 |
Все довольно логично, имхо. Создается инстанс flute, затем вызывается статический метод от класса-родителя. Статический метод вызывает метод инстанса play, который был переопределен.... тов.powerOn прав, полиморфизм, господа ;)
Вдогонку:
Если изменить код таким образом, то что же должно произойти? ;)) Добавлено через 58 секунд ну, в общем, все уже сказали |
||||
|
|||||
| v2v |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1620 Регистрация: 20.9.2006 Где: Киев Репутация: 8 Всего: 56 |
AxNe0, ну да, твой кусок кода показывает тоже самое только более явно.
|
|||
|
||||
| niasilil |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 4.6.2007 Где: USA Репутация: 8 Всего: 9 |
Это не баг, это фича. Выбор функций и полей виртуальной машиной определяется во время runtime. Поначалу не очень логично, просто надо привыкнуть.
Логика такая: Пусть мы в какой нибудь ArrayList кладем много всяких Instrument, которые все звучат по разному, потому что play() is overridden. Предстваим что jvm запускает метод play() класса Instrument, и получится что все инструменты звучат одинаково, хотя мы и старались переепределить play(). Нет уж, once you've overridden the method of a class, you forget thinking about it. -------------------- SCJP 5.0, SCJD |
|||
|
||||
| v2v |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1620 Регистрация: 20.9.2006 Где: Киев Репутация: 8 Всего: 56 |
йоу, не заметил : тема помечена как решённая , я разобрался в чём фишка и как оно называется ?!;)
|
|||
|
||||
![]()
|
| Правила форума "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. |