Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
# Override в Java
Override (переопределение) — это механизм объектно-ориентированного программирования, который позволяет подклассу предоставить собственную реализацию метода, уже определённого в суперклассе (родительском классе). Это ключевая концепция полиморфизма в Java.
Основные концепции
Овваррайдинг позволяет:
- Заменить реализацию метода родителя в наследующем классе
- Сохранить сигнатуру метода (имя и параметры)
- Использовать одного и того же ссылку на объект для вызова разных реализаций
Правила Override
Сигнатура метода
Метод-переопределитель должен иметь точно такую же сигнатуру:
public class Animal {
public void sound() {
System.out.println("Some sound");
}
}
public class Dog extends Animal {
@Override
public void sound() {
System.out.println("Woof!");
}
}
Модификаторы доступа
Модификатор доступа переопределяемого метода должен быть таким же или более открытым:
// Правильно
public void method() {}
@Override
public void method() {} // public остаётся public
// Неправильно
public void method() {}
@Override
protected void method() {} // protected < public (ошибка)
Возвращаемый тип
Возвращаемый тип может быть коварианты (подтип возвращаемого типа родителя):
public class Parent {
public Animal getAnimal() {
return new Animal();
}
}
public class Child extends Parent {
@Override
public Dog getAnimal() { // Dog extends Animal OK
return new Dog();
}
}
Аннотация @Override
Аннотация помогает компилятору проверить корректность переопределения:
public class Parent {
public void display() {
System.out.println("Parent");
}
}
public class Child extends Parent {
@Override
public void display() {
System.out.println("Child");
}
}
Если указать неверную сигнатуру, компилятор выдаст ошибку.
Полиморфизм и Override
Основное преимущество override — полиморфизм во время выполнения:
Animal dog = new Dog();
Animal cat = new Cat();
dog.sound(); // Выведет Woof Вызовется Dog.sound()
cat.sound(); // Выведет Meow Вызовется Cat.sound()
Вызов метода определяется типом объекта во время выполнения, а не типом ссылки.
Различие между Override и Overload
- Override: переопределение метода с той же сигнатурой в подклассе
- Overload: несколько методов с одним именем, но разными параметрами в одном классе
Методы, которые нельзя Override
- Приватные методы (private) — не доступны подклассам
- Статические методы (static) — при переопределении происходит скрытие, а не override
- Финальные методы (final) — запрещены для переопределения
- Методы final классов — в final классах переопределение невозможно
Практический пример
public abstract class PaymentProcessor {
public abstract void process(double amount);
public void logTransaction(String details) {
System.out.println("Log: " + details);
}
}
public class CreditCardProcessor extends PaymentProcessor {
@Override
public void process(double amount) {
System.out.println("Processing credit card: " + amount);
logTransaction("Credit card: " + amount);
}
}
public class PayPalProcessor extends PaymentProcessor {
@Override
public void process(double amount) {
System.out.println("Processing PayPal: " + amount);
logTransaction("PayPal: " + amount);
}
}
Override — фундаментальная концепция для создания гибкого и расширяемого кода через полиморфизм.