Что такое перегрузка метода (overloading)?
- Чем перегрузка отличается от переопределения?
Перегрузка (overloading) — несколько методов с одним именем и разными параметрами в одном классе; выбор на этапе компиляции по объявленным типам аргументов. Переопределение (overriding) — подкласс заменяет метод родителя с той же сигнатурой; выбор во время выполнения по реальному типу объекта.
- Тип возвращаемого значения не участвует в перегрузке
- При переопределении: не сужать доступ, не расширять проверяемые исключения, возвращаемый тип может быть подтипом
- @Override — компилятор проверит, что метод действительно переопределяет
А ещё Статические методы не переопределяются, а скрываются
Подробно
Перегрузка:
void print(int x) { ... }
void print(String s) { ... }
void print(int x, int y) { ... }
Компилятор выбирает метод по объявленным типам аргументов. Порядок: точное совпадение и расширение примитивов → с упаковкой → с varargs. Отсюда ловушка list.remove(1) у List<Integer> — удаляет по индексу.
Переопределение:
class Animal { String sound() { return "..."; } }
class Cat extends Animal { @Override String sound() { return "мяу"; } }
Animal a = new Cat();
a.sound(); // "мяу" — по реальному типу
Правила: та же сигнатура; доступ не уже; проверяемых исключений не больше; возвращаемый тип — тот же или подтип (ковариантность).
| перегрузка | переопределение | |
|---|---|---|
| где | в одном классе (или наследнике) | в подклассе |
| сигнатура | разные параметры | та же |
| выбор | компиляция | выполнение |
Что хотят услышать
- Определения и время выбора.
- Правила переопределения.
Частые ошибки
- Считать, что перегрузку можно сделать только разным return type.
- Путать overloading и overriding.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Несколько методов с одним именем, но разными параметрами
- ✗Замена реализации метода родителя в подклассе с той же сигнатурой
- ✗Запрет вызова метода из другого пакета
- ✗Автоматический выбор конструктора JVM после выполнения
Что спросят дальше
- Что входит в сигнатуру метода?
- Как varargs влияет на выбор перегрузки?
Разбор темы
- Методы: pass-by-value, перегрузка, varargs
Почему Java всегда pass-by-value, разрешение перегрузки на этапе компиляции и устройство varargs.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.