— Привіт! Я розповім тобі про перевантаження методів.

— Їх ще й перевантажувати можна? Та що за день сьогодні такий!

— З ними багато чого можна робити, але не будемо про це.

— Згоден.

— Перевантаження – це дуже проста операція. Насправді це навіть не операція над методами, хоча іноді її називають страшним словосполученням – параметричний поліморфізм.

Річ у тім, що всі методи в класі повинні мати унікальні імена.

— Так, я знаю про це.

— Так от: це не зовсім так, а точніше — зовсім не так. Метод не повинен мати унікальне ім'я. Унікальною має бути сукупність імені і типів параметрів  цього методу. Їх ще називають сигнатурами методів.

Код Опис
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, Intellij IDEA допомагає тобі і видає в підказці пару десятків методів із різними параметрами. Компілятор просто визначить потрібний метод за типами змінних, які ти туди передаєш, і пропише виклик саме його.

— Це начебто нескладно. Все ж не поліморфізм.

— Точніше — не перевизначення методів.

До речі, звертаю твою увагу, що імена параметрів ролі не відіграють  – вони губляться під час компіляції. Після компіляції про метод відомо тільки його ім'я та типи параметрів.