![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Royan |
|
|||
|
Dreamer ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 14.9.2002 Где: Лондон Репутация: 3 Всего: 15 |
Посмотрите внимательно на этот код:
Угадайте, что выведется в консоль? Меня интересует вопрос почему именно такой вывод? -------------------- Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь |
|||
|
||||
| powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 47 Всего: 159 |
Надо было данный вопрос в тему "Маленький тест" написать
|
|||
|
||||
| AlexeyVorotnikov |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 658 Регистрация: 18.6.2007 Где: Москва Репутация: 10 Всего: 18 |
На первый взгляд должно получиться TREE#foo, но надо проверить...
-------------------- RTFM! Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification |
|||
|
||||
| Platon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1801 Регистрация: 25.4.2006 Репутация: 16 Всего: 40 |
Если бы было, автор бы не отписывал.
|
|||
|
||||
| AlexeyVorotnikov |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 658 Регистрация: 18.6.2007 Где: Москва Репутация: 10 Всего: 18 |
А вот фиг вам! Выводится TEST#foo... А вот почему?.. Надо подумать.
-------------------- RTFM! Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification |
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 24 Всего: 151 |
Мда... Royan, молоток. Никогда бы не подумал о подобных граблях.
-------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| mindflyer |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 113 Регистрация: 20.10.2004 Где: Smolensk, Russia Репутация: 1 Всего: 4 |
ИМХО.
Для компилятора здесь нет сравнения приоритетов, ибо в классе Test только одна подходящая функция. Чтобы заработало иначе, нужно либо создать как
либо добавить метод void foo(String a) в класс Test либо
В компиляторах слабо разбираюсь, но могу предположить, что в данном случае компилятор в классе Test находит только одну функцию с подходящей сигнатурой, её и прописывает. А вот если вызвать ту же строчку кода но на прикастенном к Tree объекте, он уже будет анализировать обе функции. То же самое, если создать аналогичную функцию в классе Test Это сообщение отредактировал(а) mindflyer - 18.10.2007, 08:44 |
||||
|
|||||
| AlexeyVorotnikov |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 658 Регистрация: 18.6.2007 Где: Москва Репутация: 10 Всего: 18 |
batigoal, Royan просто к экзамену готовится, поэтому всякие странные вопросы из теста и спрашивает.
mindflyer, абсолютно верно. -------------------- RTFM! Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification |
|||
|
||||
| Platon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1801 Регистрация: 25.4.2006 Репутация: 16 Всего: 40 |
Зато какой брейн сторм!!! Молот Royan!!!
|
|||
|
||||
| pompei |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 7.9.2007 Репутация: 1 Всего: 6 |
Да действительно так и работает. Но этоже вообще тупой глюк компилятора.
Чё за ерунда: Пишешь: Test a = new Tree(); Печатается: TEST#foo Пишешь: Tree a = new Tree(); Печатается: TREE#foo Лажа какая-то. Вообще доложно быть так, что выбор метода должен зависеть только от типа объекта, а тут ещё есть зависимость от типа переменной. --------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап. |
|||
|
||||
| jsse |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 99 Регистрация: 1.5.2006 Где: Кривой Рог Репутация: нет Всего: 2 |
Это не глюк компилятора, а полиморфизм )
добавить к примеру в класс Tree функцию bar(String a) вызвать из main() a.bar("a");
Такой код даже не скомпилируется, потому что компилятор будет искать метод в классе Test. |
|||
|
||||
| pompei |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 7.9.2007 Репутация: 1 Всего: 6 |
А да точно, с компилатором всё нормально. jsse! +1
Только всё равно косях с их стороны остаётся: необходимо было предусмотреть такую неоднозначность, например, запрещать компилировать класс Tree из-за того что возникает эта неоднозначность. Т.е. ввести какое-нибудь правило типа: нельзя создавать многоаргументный метод, которому могут подходить родительские методы по спецификации вызова, и нельзя создавать метод, который подходит к какому-нибудь родительскому многоаргументному методу по спецификации вызова. Вот! --------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап. |
|||
|
||||
| nornad |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1079 Регистрация: 16.2.2007 Где: в Караганде Репутация: 16 Всего: 31 |
Э... не вижу логики. Почему компилятор должен запретить компиляцию класса, который расширяет уже имеющийся? Я бы в данном случае запрещал компиляцию именно Test, т.к. в его коде идёт попытка вызвать несуществующий метод. Что, в общем-то, и делает компилятор. Мы с ним в этом вопросе выбрали одну точку зрения. -------------------- Три достоинства программиста: Леность, Нетерпение и Гордость Ларри Уолл |
|||
|
||||
| nornad |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1079 Регистрация: 16.2.2007 Где: в Караганде Репутация: 16 Всего: 31 |
Что-то у меня появилось непреодолимое желание забанить этого анонимного рекламодателя.
Добавлено через 3 минуты и 16 секунд Хм... это что, новая фишка форума - реклама от гугля в виде ответа в теме? -------------------- Три достоинства программиста: Леность, Нетерпение и Гордость Ларри Уолл |
|||
|
||||
| powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 47 Всего: 159 |
||||
|
||||
| mbasil |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 399 Регистрация: 4.5.2007 Где: Москва Репутация: 2 Всего: 13 |
Господа, здесь работает перегрузка, а не полиморфизм.
Право - даже странно, что Вы пытаетесь применить полиморфизм к данному случаю. |
|||
|
||||
| pompei |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 7.9.2007 Репутация: 1 Всего: 6 |
Логика простая - пусть дочерний класс сколько хочет, столько и расширяет базовый, но только так, чтобы не запутать пользователя. А запрещать компилировать класс Test нельзя, потому что он может быть в другом, уже откомпилированном пакете, и откомпилировать его мог кто-нибудь другой. А Вы вдруг ему из будущего запрещаете компилировать. Нарушаются базовые причинно-следственные связи! Добавлено через 9 минут и 48 секунд
А да точно, Вы правы. Я почемуто не заметил. Я думал под словом полиморфизм, слово перегрузка. ЗЫ. Я вообще щитаю, что термин "перегрузка" не правильно придумали. Под словом "перегружать" ассоциируется что-то, что нужно заменить, чтобы старое определение изчезло, ну или что-то в этом духе. Можно былобы термин "перегрузить" сделать синонимом к термину "переопределить реализацию базового метода в доченем классе". А вместо "перегруженный метод" говорить "одноимённый метод" - сразу всё чётко ясно и понятно становиться. После таких рассуждений я начинаю понимать зачем появился язык Эспиранто" --------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап. |
|||
|
||||
| nornad |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1079 Регистрация: 16.2.2007 Где: в Караганде Репутация: 16 Всего: 31 |
Логика не такая уж и простая. При ней надо запрещать такое:
И что мы тогда получаем? В случае, если нам требуется различный код обработки различных объектов, придётся писать if по instanceof. Имхо, различные методы в данном случае удобнее.
Другой пакет в таком случае не мог быть откомпилирован. Если же класс был изменён - перестаём компилировать Test по уже названной причине и отрываем ноги такому "изменятелю". Лучше сразу по самую шею. Нефиг нарушать свои же принцыпы - "но только так, чтобы не запутать пользователя". Нефиг вызывать то, чего нет. Пытаешься - по кумполу и в канаву. -------------------- Три достоинства программиста: Леность, Нетерпение и Гордость Ларри Уолл |
||||||
|
|||||||
![]()
|
| Правила форума "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. |