Как ответить
Отличие между перегрузкой (overloading) и переопределением (overriding) — в механизме связывания вызова метода с его реализацией. Перегрузка решается на этапе компиляции (статическое связывание), переопределение — на этапе выполнения (динамическое связывание).
Перегрузка — несколько методов с одинаковым именем, но разными параметрами (тип, количество, порядок). Возвращаемый тип может отличаться, но на него компилятор не ориентируется. Перегрузка работает внутри одного класса.
class Calculator {
int add(int a, int b) { return a + b; }
double add(double a, double b) { return a + b; }
int add(int a, int b, int c) { return a + b + c; }
}
// Вызов: calculator.add(2, 3) — будет вызван первый метод в зависимости от типов аргументов.Переопределение — метод подкласса заменяет метод суперкласса с той же сигнатурой (имя + параметры). Используется для полиморфизма: код, написанный против базового класса, вызывается с конкретной реализацией наследника.
class Animal {
void speak() { System.out.println("Animal speaks"); }
}
class Dog extends Animal {
@Override
void speak() { System.out.println("Woof"); }
}
// Animal a = new Dog(); a.speak(); // Выведет "Woof"- Перегрузка — один класс, разные сигнатуры; переопределение — разные классы (иерархия), одинаковая сигнатура.
- Перегрузка не требует наследования; переопределение требует наследования.
- Перегрузка — compile-time (раннее связывание); переопределение — runtime (позднее связывание).
- Статические и private-методы можно перегружать, но нельзя переопределять (они привязаны к классу, а не к объекту).
На собеседовании полезно упомянуть аннотацию @Override — она проверяет корректность переопределения и помогает избежать опечаток. Также стоит сказать, что в Java конструкторы можно перегружать, но не переопределять.