JavaRush /Курсы /Java Syntax Pro /Перегрузка методов - overloading

Перегрузка методов - overloading

Java Syntax Pro
17 уровень , 4 лекция
Открыта

Перегрузка методов

И еще одна новая и интересная тема на сегодня — перегрузка методов. Или как ее еще часто называют, overloading (переопределение — это overriding).

В отличие от переопределения, перегрузка — это очень простая операция. На самом деле это даже не операция над методами, хотя иногда ее называют страшным словосочетанием — параметрический полиморфизм.

Дело в том, что все методы внутри класса должны иметь уникальные имена. Так вот, это не совсем так. Вернее, совсем не так. Метод не должен иметь уникальное имя. Уникальным должно быть объединение имени и типов параметров этого метода. Такие объединения еще называют сигнатурами методов

Примеры:

Код Описание
public void print();
public void print2();
Так можно. Два метода имеют уникальные имена.
public void print();
public void print(int n);
И так можно. Два метода имеют уникальные имена (сигнатуры).
public void print(int n, int n2);
public void print(int n);
Все еще уникальные методы
public int print(int a);
public void print(int n);
А так нельзя. Методы — не уникальные. Хоть и возвращают разные типы.
public int print(int a, long b);
public long print(long b, int a);
А так — можно. Параметры методов уникальные.

В сигнатуру входит: имя метода и типы параметров. Не входит: тип результата метода и имена параметров. В классе не может быть двух методов с одинаковыми сигнатурами: компилятор не разберется, какой из них нужно вызвать.

Имена параметров роли не играют : они теряются при компиляции. После компиляции о методе известно только его имя и типы параметров. Тип результата не теряется, но результат функции не обязательно чему-то присваивать, поэтому его тоже не включают в сигнатуру.

Согласно принципам ООП, полиморфизм — это сокрытие различных реализаций за одним интерфейсом. А т.к. при вызове метода System.out.println(), например, в зависимости от параметров вызываются различные методы, формально это подпадает под определение полиморфизма.

Именно поэтому разные методы с одинаковыми именами, находящиеся в одном классе, принято считать хоть и слабой, но все же формой полиморфизма.


Комментарии (156)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Nazadain Уровень 27
25 октября 2024
На самом деле, эту задачу вполне можно было бы решить и без перегрузки, просто используя такую конструкцию

public void min(int... nums) {}
Жаль, условие не позволяет.
Rustam Уровень 22 Student
17 октября 2024
Какой-то легкий уровень после файлов и дат)
Bloodlicker Уровень 28
26 октября 2024
Да вроде даты были легкими...
Sergo Уровень 20
11 октября 2024
Знал бы я на адском уровне с массивами то, что решение данной задачи с использованием массива для меня окажется самым простым способом) Даже не вспомнил про Math )
Evgeniy Orashkov Уровень 31
10 октября 2024
Всем привет! Кому интересно - урок про перегрузку: overloading
6aHguTo Уровень 30
2 октября 2024
последнюю задачу решил полностью через if. получилось 107 строчек кода))))) валидатор принял)) но если бы я такое где то на реальной работе сделал, меня бы наверное уволили)))
Dmitry Kellerman Уровень 26
11 октября 2024

public static int min(int a, int b) {
     return a > b ? b : a;
    }

    public static int min(int a, int b, int c) {
        return min(a, b) > c ? c : min(a, b);
    }

    public static int min(int a, int b, int c, int d) {
        return min(a, b, c) > d ? d : min(a, b, c);
    }

    public static int min(int a, int b, int c, int d, int e) {
        return min(a, b, c, d) > e ? e : min(a, b, c, d);
    }
6aHguTo Уровень 30
12 октября 2024
Большое спасибо за пример)) Я не сразу допер как это вообще может работать, пока не понял что каждый следующий метод использует результат работы пред идущих)) Получается что эти методы связаны, и не могут работать не зависимо(кроме первого). Интересно как будет работать допустим последний метод если его вызвать в другом классе??? Подтянет ли он пре идущие автоматом или нет??
Dmitry Kellerman Уровень 26
12 октября 2024
Конечно, подтянет. Не подтянет, а вызовет. Это пример инкапсуляции. Допустим, если взять последний метод - вы как пользователь должны передать пять аргументов в параметры метода, и это все, что от вас требуется. А как и что он с этими аргументами там делает, это уже скрытая реализация. Для вас как для пользователя важен результат, а каким образом он достигается, для вас не должно быть доступно. Он под капотом вызовет перегруженный метод своего же класса, но с 4 параметрами, потом метод с 4 параметрами вызовет метод с 3 параметрами, и так по цепочке выше. Это похоже на рекурсию - метод, который вызывает самого себя. Результат будет возвращаться сверху вниз - метод с двумя переданными параметрами вернет результат в метод с тремя параметрами, тот вычислит получившийся минимум и вернет результат в метод с четырьмя параметрами, тот сравнит и передаст последнему. Получается стек в контексте рекурсии - метод, который вы вызывали, ждет результат выполнения метода с четырьмя параметрами, далее метод с четырьмя параметрами вызывает метод с тремя и ждет от него результата и т.д. А потом в обратном порядке, как уже выше описано. Стек реализован по принципу LIFO - последним зашел, вышел первым. То есть последним в наш стек рекурсий попал метод с двумя параметрами, но он первым и вышел, отработав и передав результат выше, в метод который ждал результата его выполнения.
Dmitry Kellerman Уровень 26
12 октября 2024
А можно было бы написать еще лаконичнее, без тернарного оператора в методах с 3,4 и 5 параметрами - это у меня мозги ночью плохо работают.

    public static int min(int a, int b) {
        return a > b ? b : a;
    }

    public static int min(int a, int b, int c) {
        return min(min(a, b), с);
    }

    public static int min(int a, int b, int c, int d) {
        return min(min(a, b, c), d);
    }

    public static int min(int a, int b, int c, int d, int e) {
        return min(min(a, b, c, d), e);
    }
iAlex Уровень 29
2 июля 2024
Вот не понятно условие задачи и все, сколько параметров должно передаваться в начале сколько в последнем. где конкретика.
Kostas Уровень 23 Expert
19 сентября 2024
Так, вроде, сказали: "Каждый из методов должен быть перегружен так, чтобы была возможность вызвать метод с двумя, тремя, четырьмя и пятью параметрами"
Anastasia Уровень 51
1 мая 2024
Я решила точно так же как в ответе, но везде писала полные формулы Math.max, почему в ответе их сократили до напр: return max(c, max(a, b)); разве так можно делать?
judeclapton Уровень 32
1 мая 2024
в данном случае используют первый метод, который с двумя аргументами
Sergey Klokov Уровень 30
12 июля 2024
Я совсем забыл про Math.max/min, грузанул в Collections.min )))
{Java_Shark} Уровень 28
24 апреля 2024
Самая быстрая лекция в копилку))) всем добра!!!)))
Light_Day :) Уровень 46
30 апреля 2024
плюс, плюс - спидран по прочтению лекции, погнали!
kaidzualex Уровень 37 Expert
23 апреля 2024
Сейчас бы задачу решить всю ветвлениями, а не через min/max))) С первой попытки написал правильно, хоть алгоритмическое мышление улучшил. Зачем тогда там medium, если можно было через Math решать
Nekochnev Уровень 21
9 апреля 2024
public static int min(int ints, int ints1,int a) { ArrayList<Integer> arrayList = new ArrayList<>(); Collections.addAll(arrayList,ints,ints1,a); Collections.sort(arrayList); return arrayList.get(0); } Выполнил через сортировку листа, знаю, что можно было через Math.max||min, но я захотел так, имхо
25 июля 2024
а я через обычный массив выполнил, в цикле присваивал переменной min значение первого индекса и дальше сравнивал