| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Механизм перегрузки методов "полиморфизм" |
| Автор: initmax 5.10.2009, 11:45 | ||||
| Пытаюсь разобраться в какой полследовательности происходит перегрузка методов. То 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 5.10.2009, 12:32 |
| Не путайте (1) перегрузку методов и (2) полиморфизм (переопределение) Для полиморфизма необходимо, чтобы сигнатура метода в родительском классе и классе потомке была ОДИНАКОВА (с некоторыми исключениями). Для проверки правильности одинаковой сигнатуры компилятором мы используем аннотацию @Override. Для перегрузки методов НЕОБХОДИМО наличие разных типов параметров или разное их количество. То есть при одинаковом названии это разные методы. |
| Автор: initmax 5.10.2009, 14:21 |
| Что означает "сигнатур"? в классе родителе и классе потомке должны быть одинаковы методы, только в этом случае будет организовано понятие полиморфизма ? |
| Автор: aleksandy 5.10.2009, 18:03 |
| да |
| Автор: mbasil 5.10.2009, 19:23 |
| Для работы полиморфизма "подписи" методов должны быть одинаковы, то есть одинаковы должны быть не только названия методов, но также количество параметров и их типы. Полиморфизм работает только в рамках наследования - "родитель-потомок". Перегрузка работает и в одном классе, и выполняется при разных параметрах. Это разные механизмы. ЗАМЕЧАНИЕ: В полиморфных методах, в их "подписях", могут несколько отличаться только модификатор доступа и выбрасываемые исключения. |
| Автор: initmax 6.10.2009, 15:58 | ||||
| Другими словами...?: При наличии множества объектов обладающих общим предком и имеющим одинаковые по типу, наименованию и параметрам методы но разнящихся по реализации данных методов, используется полиформизм "многоформие".В java используется так называемое позднее связываение которое позволяет произвести вызов тела метода того или иного объекта в момент выполнения программы "на лету", получая информацию из спец. фрагментов кода об адресах методов в объектах. В С++ например для осущетсления познего связывания методы должны быть объявлены как virtual. Иначе С++ осуществляет так называемое раньее связывание, которое выполняется в момент компиляции программного кода. Генерируется компилятором вызов функции с данным именем, а линкер намертво привязывает этот вызов к абсолютному адресу кода, который предполагается к выполнению. Пример полиморфизма организовал на следующей задачке. Есть некоторое множество рыбаков, каждый из которых обладает идентичными методами, но отличается внутреней реализацией данных методов. Все умеют ловить рыбу, но количество улова у каждого класса рыбака различны, т.е. реализация методов различна.
В момент вызова методов
происходит так называемое позденее связываение, которое удовлетворяет концепцию полиморфизма. Всё ли верно? дополните/подправьте... Спасибо за внимание. |
| Автор: revenforv 6.10.2009, 22:11 |
| Можно дополнить еще, что "позднее" связывание также называется динамическим. В http://forum.vingrad.ru/forum/topic-275017.html я уже разъяснял то, как это происходит (согласно спецификации языка Java). Буду рад, если она как-то дополнит ответ на поставленный вопрос.. |
| Автор: initmax 7.10.2009, 08:47 |
| Спасибо! Интересно "ранее связывание" в java существует? |
| Автор: mbasil 7.10.2009, 09:02 |
| Существует, для static и final методов. |
| Автор: ValerStrim 20.10.2010, 23:15 | ||
| Я новичок и пытаюсь разобраться в перегрузках методов класса Допустим есть класс 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 21.10.2010, 11:34 | ||||||
Ок, будем рассуждать логически. Пусть у Вас есть два метода:
Ответьте на простой вопрос. Какой метод будет вызван в этом случае:
P.S. Я имею полное право вызвать метод, не используя возвращаемого значения. |
| Автор: ValerStrim 21.10.2010, 12:14 |
| в соседней теме объяснили, да и сам вижу что ошибка на начальном этапе. вопрос решён. |
| Автор: danilka 22.10.2010, 13:23 | ||
Начиная с 5-й джавы в перегруженном методе возвращаемым объектом может быть не только объект класса родительского метода но и его потомок. |