![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Обычно иерархия наследования не большая, так что в таблицу можно занести все классы, и для каждого указать какой метод вызывать. Хотя это все конечно зависит от реализации.
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 47 Всего: 159 |
Так вопрос немного прояснился
![]() Вот документация проясняющая ситуацию в целом. Думаю, что там есть ответы на все вопросы. ![]() Спецификация Виртуальной Машины языка Ява http://www.uni-vologda.ac.ru/java/jvm/outline.htm Спецификация языка Ява http://www.uni-vologda.ac.ru/java/jls/index.html |
|||
|
||||
chief39 |
|
|||
![]() карманная тигра ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1631 Регистрация: 20.5.2005 Где: Киев Репутация: 15 Всего: 77 |
У неё есть исходные данные:
- сигнатура метода(вобщем точное его описание) - конкретный объект - исходя из второго - класс объекта. Неважно на объект какого класса ссылка - JVM умеет точно определить конечный класс - то есть тот, который отвечает реальному объекту. То есть, если мы передадим ссылку на Object, она всё равно может вычислить что у нас там лежит String или производное от String'a - исходя из третьего - список родителей этого класса. В таблице будут лежать методы нашего класса, его родителя, дальнейших родителей и прабабушек. Поищет метод для нашего класса. Если нету - для родителя. Если и у него нету - тогда ещё выше. Пока не найдёт где мы перестали переопределять сей метод. Такого, чтоб метода не было вообще - быть не может - ибо компилятор ругнётся ещё при создании такого кода. Если мы допишем новый - ноу проблем. но хоть что-то должно быть, когда вызываем. Например, есть класс Animal. У него метод born(). Наследуем в Cat и переопределяем born(). Компилим. Вызываем для Cat born(). Выполнится кошачий а не животный born(). Создаём Dog, унаследовав от Animal. Компилим. Вызываем у Dog born(). Вызовется Animal'ский Дописываем Догу свой born(). КОМПИЛИМ ТОЛЬКО Dog! Animal и Cat лежат скомпиленые с прошлого раза неизменно!!! Запускаем. Вызовется born() из Dog (потому что нашло раньше чем аналог в Animal). Раньше не было - добиралось до Animal. Суть в том, что Animal не пришлось перекомпилить. Он не знал что у Dog есть(может быть такой метод). Он обнаружил его и связался с ним во время выполнения. При раннем связывании, пришлось бы животное тоже компилить. (принимаем что в примере мы обращались к объекту Dog по ссылке типа Animal). -------------------- Люди - это свечи. Они либо горят, либо их - в жопу!(с) |
|||
|
||||
powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 47 Всего: 159 |
Т.е. я так понял, что в Java все очень динамически сделано. Остается только выразить восторг архитекторам JVM, поскольку при такой реализации вызов метода у java класса порядком опережает (судя по вот этой статье http://www.codenet.ru/webmast/java/javavscpp.php) вызоав виртуального метода в С++. |
|||
|
||||
chief39 |
|
|||
![]() карманная тигра ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1631 Регистрация: 20.5.2005 Где: Киев Репутация: 15 Всего: 77 |
АХА. Можно final добавлять - тогда компилер МОЖЕТ РЕШИТЬ вписать намертво(всё равно не переопределят). Но не рекомендуют такое для ускорения производительности - только для запрета переопределения. Хотя и запрет надо с оглядкой юзать. Дядька Эккель попинывает создателей стандартного класса Vector за финалы в его реализации. Так что... "всю власть - гибкости!" ![]() -------------------- Люди - это свечи. Они либо горят, либо их - в жопу!(с) |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |