Ответ
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
}