Каковы правила перегрузки методов в Java?

«Каковы правила перегрузки методов в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Основное правило: Сигнатуры перегруженных методов должны быть уникальны. Сигнатура включает имя метода и типы его параметров (их порядок важен).

Что можно менять для перегрузки:

  1. Типы параметров.
  2. Количество параметров.
  3. Порядок параметров (если типы разные).

Что НЕ учитывается при перегрузке (и не создаёт уникальную сигнатуру):

  • Возвращаемый тип.
  • Модификаторы доступа (public, private).
  • Ключевые слова (final, static — хотя static позволяет сосуществовать, это не классическая перегрузка).
  • Имена параметров.

Примеры корректной перегрузки:

void process(int x) { }
void process(String s) { }          // OK: другой тип параметра
void process(int x, String s) { }   // OK: другое количество
void process(String s, int x) { }   // OK: другой порядок типов

Пример конфликта (ошибка компиляции):

void execute(String[] arr) { }
void execute(String... varargs) { } // Ошибка: varargs неотличим от массива

Почему? Компилятор использует сигнатуру для однозначного определения вызываемого метода. Изменение возвращаемого типа недостаточно, так как вызов метода может игнорировать возвращаемое значение.