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

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

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