В чем разница между перегрузкой и переопределением метода в Java?

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

Ответ

Перегрузка метода (Method Overloading) — это создание нескольких методов в одном классе с одинаковым именем, но разными параметрами (типом, количеством или порядком). Выбор конкретного метода происходит на этапе компиляции (статический полиморфизм).

Переопределение метода (Method Overriding) — это замена реализации метода, унаследованного от родительского класса, в дочернем классе. Сигнатура метода (имя, параметры, возвращаемый тип) должна совпадать. Выбор метода происходит во время выполнения (динамический полиморфизм).

Ключевые различия: Критерий Перегрузка (Overloading) Переопределение (Overriding)
Класс В пределах одного класса В разных классах (иерархия наследования)
Сигнатура Должна отличаться Должна совпадать
Тип полиморфизма Статический (Compile-time) Динамический (Runtime)
Аннотация Не требуется Рекомендуется @Override
Возвращаемый тип Может отличаться Должен быть ковариантным или одинаковым

Пример перегрузки:

class Printer {
    void print(int x) { System.out.println("Целое: " + x); }
    void print(String s) { System.out.println("Строка: " + s); } // Перегрузка
    void print(int x, String s) { System.out.println(x + ": " + s); } // Перегрузка
}

Пример переопределения:

class Animal {
    void makeSound() {
        System.out.println("Животное издает звук");
    }
}

class Dog extends Animal {
    @Override
    void makeSound() { // Переопределение
        System.out.println("Гав!");
    }
}