В чем разница между Overload и Override в Java?

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

Ответ

Overloading (Перегрузка) и Overriding (Переопределение) — это разные концепции ООП в Java.

Критерий Перегрузка (Overload) Переопределение (Override)
Класс В пределах одного класса (или между родительским и дочерним). Только в дочернем классе по отношению к родительскому.
Сигнатура метода Должна отличаться (тип, количество, порядок параметров). Должна совпадать полностью (имя, параметры, возвращаемый тип).
Тип возвращаемого значения Может отличаться, но не является критерием для перегрузки. Должен совпадать или быть ковариантным (подтипом).
Модификаторы доступа Любые, без ограничений. Нельзя сужать (например, public -> private). Можно расширять.
@Override аннотация Не используется. Рекомендуется для проверки компилятором.
Связь с наследованием Не обязательна. Требует отношения наследования.
Полиморфизм Полиморфизм времени компиляции (Compile-time). Решение принимает компилятор. Полиморфизм времени выполнения (Runtime). Решение принимает JVM на основе типа объекта.
Цель Предоставить несколько способов вызова метода с разными параметрами. Изменить или уточнить поведение унаследованного метода.

Примеры:

// ПЕРЕГРУЗКА (Overload) - в одном классе
class MathUtil {
    int sum(int a, int b) { return a + b; }
    double sum(double a, double b) { return a + b; } // Overload
}

// ПЕРЕОПРЕДЕЛЕНИЕ (Override) - между классами
class Parent {
    void show() { System.out.println("Parent"); }
}
class Child extends Parent {
    @Override
    void show() { System.out.println("Child"); } // Override
}