ENIGMA AI
ENIGMA AI

В чём заключается отличие между этими понятиями?

встречается 5× junior general

Как ответить

Отличие между перегрузкой (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 конструкторы можно перегружать, но не переопределять.

Ключевые тезисы

  • Перегрузка — статическое связывание (компиляция), переопределение — динамическое (runtime).
  • Перегрузка: одинаковое имя, разные параметры; внутри одного класса. Переопределение: одинаковая сигнатура, разные классы в иерархии.
  • Перегрузка не зависит от наследования, переопределение требует наследования.
  • Private и static методы перегружаются, но не переопределяются (скрываются).
  • Аннотация @Override — защита от ошибок при переопределении.

Что спросят дальше

  • — Как JVM выбирает, какой метод вызвать при переопределении? Что такое vtable?
  • — Можно ли переопределить статический метод? Объясни на примере с instanceof.
  • — Приведи пример, когда перегрузка может привести к неоднозначности для компилятора.

Готовьтесь к собеседованию с ENIGMA AI

AI-суфлёр подсказывает ответы прямо на собеседовании в реальном времени — незаметно для интервьюера.

Скачать приложение