JavaRush /Курси /Java Syntax Zero /Перевантаження методів — overloading

Перевантаження методів — overloading

Java Syntax Zero
Рівень 18 , Лекція 5
Відкрита

Перевантаження методів

Ще одна нова й цікава тема на сьогодні — перевантаження методів. Цей процес також часто називають, 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(), залежно від параметрів викликаються різні методи, формально це підпадає під визначення поліморфізму.

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


Коментарі (12)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Den Deni Рівень 51
5 липня 2024
ArrayList<Integer> numbers = new ArrayList<>(); numbers.add(a); numbers.add(b); numbers.add(c); numbers.add(d); numbers.add(i); return Collections.min(numbers); Моя версія рішення, для легкого зрозуміня коду)) Принаймні для мене.
Ва Дим Рівень 28
6 червня 2024
Тут у коментарях а я зробив через тернарний а я через Math а я рекурсію використав. Ну я я через if 😅
Василь Рівень 1
24 жовтня 2023
є зручний метод :

Math.min(a, b);
повертає мінімальне число, по аналогії можна зробити для максимального. Також можна писати так (рекурсивно визвати метод):

Math.min(a, Math.min(b, c));
TimpoIngo Рівень 38
13 вересня 2023
Я використав такий варівнт

public static int min(int n, int m, int h, int g, int k) {
        int value = Math.min(n, m) < Math.min(h, g) ? Math.min(n, m) : Math.min(h, g);
        return value < k ? value : k;
    }
Shura Рівень 20
27 липня 2023
"Згідно із принципами ООП поліморфізм — це приховування різних реалізацій в одному інтерфейсі." Я можливо трохи заплуталась, але що тоді інкапсуляція?
Владислав Рівень 26
19 березня 2023
Виконав всі перевірки за допомогою тернарного оператора, це має надзвичайно цікавий вигляд))
 
public static int min(int a, int b, int c, int d, int e){
        return a < b ? a < c ? a < d ? a < e ? a : e : d < e ? d : e : c < d ? c < e ? c : e : d < e ? d : e : b < c ? b < d ? b < e ? b : e : d < e ? d : e : c < d ? c < e ? c : e : d < e ? d : e;
    }
 
les_yeux_blancs Рівень 50
30 квітня 2023
краще ніколи в житті так не робити)
WhoAMI Рівень 51
21 грудня 2022
не розумію чому не сприймає варіант з рішенням через умову порівняння двох чисел? при чому з пошуком мінімального числа зараховує а з максимаьним ні
18 листопада 2022
Чому не розглядаються альтернативні варіанти вирішення, наприклад такий:

package ua.javarush.task.pro.task17.task1708;

/* 
Мінімальне й максимальне
*/

import java.util.Arrays;

public class MinMaxUtil {
    
    public static int min(int ... params){
        Arrays.sort(params);
       return params[0];
    }
   
    public static int max(int ... params){
        Arrays.sort(params);
       return params[params.length -1];
    }
}
Elder_HD Рівень 42 Expert
14 червня 2023
Спочатку так само хотів вирішити) але в умові чітко вказано, що необхідно створити 8 методів. А тут вже як замовник велів :)
Bandiu Band Рівень 25
28 вересня 2022
В задачі можна застосувати рекурсію: public static int max (int value, int value2, int value3, int value4) { int res=0; res = max(max(value,value2,value3),value4); return res; }
hnatiukk Рівень 51 Expert
13 грудня 2022
Але ж рекурсія це коли ми викликаємо метод в цьому самому методі, а тут викликаються інші. Така ситуація теж є рекурсією?