Ответ
Основное правило: Сигнатуры перегруженных методов должны быть уникальны. Сигнатура включает имя метода и типы его параметров (их порядок важен).
Что можно менять для перегрузки:
- Типы параметров.
- Количество параметров.
- Порядок параметров (если типы разные).
Что НЕ учитывается при перегрузке (и не создаёт уникальную сигнатуру):
- Возвращаемый тип.
- Модификаторы доступа (
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 неотличим от массива
Почему? Компилятор использует сигнатуру для однозначного определения вызываемого метода. Изменение возвращаемого типа недостаточно, так как вызов метода может игнорировать возвращаемое значение.