Ответ
Переопределение (Override) — это механизм полиморфизма, при котором метод в дочернем классе предоставляет свою собственную реализацию метода, уже существующего в родительском классе. Сигнатура метода (имя, параметры, возвращаемый тип) должна совпадать.
Перегрузка (Overload) — это создание нескольких методов в одном классе с одинаковым именем, но разными параметрами (типом, количеством или порядком). Возвращаемый тип может отличаться, но только разницы в нём недостаточно для перегрузки.
Ключевые отличия:
- Цель: Override меняет поведение унаследованного метода. Overload расширяет функциональность метода для разных входных данных.
- Связь с наследованием: Override требует иерархии классов. Overload может быть в пределах одного класса.
- Время разрешения: Override разрешается во время выполнения (динамический полиморфизм). Overload разрешается во время компиляции (статический полиморфизм).
Пример на Java:
class Animal {
void makeSound() {
System.out.println("Some generic animal sound");
}
}
class Dog extends Animal {
// Override: та же сигнатура, другая реализация.
@Override
void makeSound() {
System.out.println("Bark!");
}
// Overload: то же имя, разные параметры.
void makeSound(int volume) {
System.out.println("Bark at volume: " + volume);
}
} Ответ 18+ 🔞
Давай разберёмся, что тут у нас за ебушки-воробушки с этими оверрайдами и оверлоадами. Это ж основа основ, а народ постоянно путает, как будто в рот меня чих-пых.
Смотри, есть у тебя родительский класс, ну, типа, общий шаблон. И вот ты от него наследника делаешь. И если в наследнике ты пишешь метод с точно такой же сигнатурой (имя, параметры, возвращаемый тип — всё один в один), то это переопределение (Override). Ты по сути говоришь: «Батя, твой метод — хуйня, я сделаю по-своему». И когда будет работать программа, вызовется твоя, новая реализация. Это полиморфизм в чистом виде, динамический, на этапе выполнения.
А теперь перегрузка (Overload) — это вообще другая история. Это когда ты в пределах одного класса, даже не смотря на папу, делаешь несколько методов с одним именем, но с разными параметрами. Типа, количество другое, или типы, или порядок. Возвращаемый тип может быть разным, но только по нему перегрузку не сделаешь — компилятор тебе тут же скажет «чё за мудя?». Это как если бы у тебя был метод посчитать(деньги), а ты добавил посчитать(деньги, срок). Разные задачи, одно имя. И компилятор это всё разгребает на этапе компиляции, статически.
Короче, запомни разницу, а то пидарас шерстяной:
- Override (Переопределение) — меняешь логику унаследованной фигни. Нужна иерархия (папа-сын). Работает в рантайме.
- Overload (Перегрузка) — делаешь много одноимённых методов с разными входами в одном классе. Работает при компиляции.
Вот тебе живой пример, чтоб вообще ни хуя себе не осталось:
class Animal {
void makeSound() {
System.out.println("Some generic animal sound");
}
}
class Dog extends Animal {
// Override: та же сигнатура, другая реализация. Говорим "гав" вместо общей херни.
@Override
void makeSound() {
System.out.println("Bark!");
}
// Overload: то же имя "makeSound", но параметр другой. Теперь можно и с громкостью гавкнуть.
void makeSound(int volume) {
System.out.println("Bark at volume: " + volume);
}
}
Видишь? Собака переопределила общий метод makeSound() (динамически, вместо «какого-то звука» будет «Bark!»). И перегрузила его, добавив версию с int volume (статически, в рамках своего же класса). Всё, теперь ты гуру. Главное — не путай, а то получится пиздопроебибна в коде.