![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| initmax |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 165 Регистрация: 24.7.2009 Репутация: нет Всего: нет |
Пытаюсь разобраться в какой полследовательности происходит перегрузка методов.
То c чем удалось разобраться: Перегрузка методов поддерживает полиморфизм, поскольку это один из способов реализации в Java концепции "один интерфейс, несколько методов". Для пояснения приведем следующие рассуждения. В тех языках, которые не поддерживают перегрузку методов, каждому методу должно быть присвоено уникальное имя. 1) При вызове метода компилятор проверяет объявленный тип объекта и имя метода например вызов x.f(args) неявный параметр х объявлен как экземпляр класса С. Но может существовать несколько методов с именем f, поэтому компилятор нумерует все методы с общедоступным именем f в подклассе и суперклассе. 2) Вторым шагом происходит определение типов параметров указанных при вызове метода например f(String); f(int); f(char); ... данный процесс называется разрешением перегрузки теперь тестим
как видно из кода одноимённые методы имеют разные типы но отличные от byte, short , char public int test_method(int a) { return a+100; } public double test_method(double a) { return -100; } public float test_method(float a) { return -100; } а при их вызове передаётся именно byte, short , char. но вызывается каждый раз метод int. Интуитивно чую что есть некое дерево типов, в котором int имеет повышенный приоритет 1) как работает этот механизм 2) как это называется, посоветуйет линк З.Ы. Есть метод который принимает вот такую строку, необходимо посчитать количество слов которые содержат только латинские буквы нижнего/верхнего регистров char arr_sym[] = {' ',' ','h','e','l','l','o',' ','I','S','A',' ',' ',' ','w','o','w',' ','Q','S','6',' ',' ',' '}; вот решение
Можно ли более оптимально решить задачу? Спасибо за внимание. |
||||
|
|||||
| mbasil |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 399 Регистрация: 4.5.2007 Где: Москва Репутация: 2 Всего: 13 |
Не путайте (1) перегрузку методов и (2) полиморфизм (переопределение)
Для полиморфизма необходимо, чтобы сигнатура метода в родительском классе и классе потомке была ОДИНАКОВА (с некоторыми исключениями). Для проверки правильности одинаковой сигнатуры компилятором мы используем аннотацию @Override. Для перегрузки методов НЕОБХОДИМО наличие разных типов параметров или разное их количество. То есть при одинаковом названии это разные методы. |
|||
|
||||
| ivanovpv |
|
|||
![]() Варвар ![]() ![]() Профиль Группа: Участник Сообщений: 639 Регистрация: 26.1.2005 Где: Москва Репутация: 4 Всего: 28 |
Дело не в том, что int имеет некий повышенный приоритет, а в том, как вы вызываете test_method(). Скорее всего вызываете как
Ну и получаете по умолчанию константу 100 с типом int. Соответственно и связывание происходит с методом test_method(int a); -------------------- Aut viam inveniam aut faciam |
|||
|
||||
| initmax |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 165 Регистрация: 24.7.2009 Репутация: нет Всего: нет |
Что означает "сигнатур"? в классе родителе и классе потомке должны быть одинаковы методы, только в этом случае будет организовано понятие полиморфизма ?
|
|||
|
||||
| aleksandy |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 260 Регистрация: 17.12.2006 Репутация: 4 Всего: 5 |
да
|
|||
|
||||
| mbasil |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 399 Регистрация: 4.5.2007 Где: Москва Репутация: 2 Всего: 13 |
Для работы полиморфизма "подписи" методов должны быть одинаковы, то есть одинаковы должны быть не только названия методов, но также количество параметров и их типы. Полиморфизм работает только в рамках наследования - "родитель-потомок".
Перегрузка работает и в одном классе, и выполняется при разных параметрах. Это разные механизмы. ЗАМЕЧАНИЕ: В полиморфных методах, в их "подписях", могут несколько отличаться только модификатор доступа и выбрасываемые исключения. Это сообщение отредактировал(а) mbasil - 5.10.2009, 19:25 |
|||
|
||||
| initmax |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 165 Регистрация: 24.7.2009 Репутация: нет Всего: нет |
Другими словами...?:
При наличии множества объектов обладающих общим предком и имеющим одинаковые по типу, наименованию и параметрам методы но разнящихся по реализации данных методов, используется полиформизм "многоформие".В java используется так называемое позднее связываение которое позволяет произвести вызов тела метода того или иного объекта в момент выполнения программы "на лету", получая информацию из спец. фрагментов кода об адресах методов в объектах. В С++ например для осущетсления познего связывания методы должны быть объявлены как virtual. Иначе С++ осуществляет так называемое раньее связывание, которое выполняется в момент компиляции программного кода. Генерируется компилятором вызов функции с данным именем, а линкер намертво привязывает этот вызов к абсолютному адресу кода, который предполагается к выполнению. Пример полиморфизма организовал на следующей задачке. Есть некоторое множество рыбаков, каждый из которых обладает идентичными методами, но отличается внутреней реализацией данных методов. Все умеют ловить рыбу, но количество улова у каждого класса рыбака различны, т.е. реализация методов различна.
В момент вызова методов
происходит так называемое позденее связываение, которое удовлетворяет концепцию полиморфизма. Всё ли верно? дополните/подправьте... Спасибо за внимание. Это сообщение отредактировал(а) initmax - 6.10.2009, 16:03 |
||||
|
|||||
| revenforv |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 47 Регистрация: 6.8.2009 Где: Санкт-Петербург Репутация: нет Всего: нет |
Можно дополнить еще, что "позднее" связывание также называется динамическим.
В этой теме я уже разъяснял то, как это происходит (согласно спецификации языка Java). Буду рад, если она как-то дополнит ответ на поставленный вопрос.. |
|||
|
||||
| initmax |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 165 Регистрация: 24.7.2009 Репутация: нет Всего: нет |
Спасибо!
Интересно "ранее связывание" в java существует? Это сообщение отредактировал(а) initmax - 7.10.2009, 08:50 |
|||
|
||||
| mbasil |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 399 Регистрация: 4.5.2007 Где: Москва Репутация: 2 Всего: 13 |
Существует, для static и final методов.
|
|||
|
||||
| ValerStrim |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 20.10.2010 Репутация: нет Всего: нет |
Я новичок и пытаюсь разобраться в перегрузках методов класса
Допустим есть класс X b childX наследущий его методы... Код:
Какие из нижеприведенных перегрузок я могу юзать и это будет правильно: public int sum(int a, long b){return 0;} public long Sum(int a, int b){return 0;} public int sum(int b, int a){return 0;} public void sum(float x, float z){} public abstract void sum(){} Идея в том чтобы метод sum() мог возвращать значения как типа int, так и long Чёт не получается, помгите, разьясните, что можно, что нельзя ((( Заранее благодарю! |
|||
|
||||
| Skipy |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 487 Регистрация: 24.8.2006 Где: Москва, Россия Репутация: 6 Всего: 16 |
Ок, будем рассуждать логически. Пусть у Вас есть два метода:
Ответьте на простой вопрос. Какой метод будет вызван в этом случае:
P.S. Я имею полное право вызвать метод, не используя возвращаемого значения. |
||||||
|
|||||||
| ValerStrim |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 20.10.2010 Репутация: нет Всего: нет |
в соседней теме объяснили, да и сам вижу что ошибка на начальном этапе.
вопрос решён. Это сообщение отредактировал(а) ValerStrim - 21.10.2010, 18:37 |
|||
|
||||
| danilka |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 15.1.2010 Репутация: нет Всего: нет |
Начиная с 5-й джавы в перегруженном методе возвращаемым объектом может быть не только объект класса родительского метода но и его потомок. |
|||
|
||||
![]()
|
| Правила форума "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. |