Java — переопределение
В предыдущей главе мы говорили о суперклассах и подклассах. Если класс наследует метод от своего суперкласса, то есть шанс переопределить метод при условии, что он не помечен как окончательный.
Преимущество переопределения:возможность определить поведение, специфичное для типа подкласса, что означает, что подкласс может реализовать метод родительского класса на основе его требований.
В объектно-ориентированных терминах переопределение означает переопределение функциональности существующего метода.
Пример
Давайте рассмотрим пример.
Живая демонстрацияclass Animal { public void move() { System.out.println("Animals can move"); } } class Dog extends Animal { public void move() { System.out.println("Dogs can walk and run"); } } public class TestDog { public static void main(String args[]) { Animal a = new Animal(); // Animal reference and object Animal b = new Dog(); // Animal reference but Dog object a.move(); // runs the method in Animal class b.move(); // runs the method in Dog class } }
Это даст следующий результат —
Вывод
Animals can move Dogs can walk and run
В приведенном выше примере вы можете видеть, что хотя b является типом Animal, он запускает метод перемещения в классе Dog. Причина этого такова:во время компиляции выполняется проверка ссылочного типа. Однако во время выполнения JVM определяет тип объекта и запускает метод, принадлежащий этому конкретному объекту.
Следовательно, в приведенном выше примере программа будет скомпилирована правильно, поскольку в классе Animal есть метод move. Затем во время выполнения он запускает метод, специфичный для этого объекта.
Рассмотрим следующий пример —
Пример
Живая демонстрацияclass Animal { public void move() { System.out.println("Animals can move"); } } class Dog extends Animal { public void move() { System.out.println("Dogs can walk and run"); } public void bark() { System.out.println("Dogs can bark"); } } public class TestDog { public static void main(String args[]) { Animal a = new Animal(); // Animal reference and object Animal b = new Dog(); // Animal reference but Dog object a.move(); // runs the method in Animal class b.move(); // runs the method in Dog class b.bark(); } }
Это даст следующий результат —
Вывод
TestDog.java:26: error: cannot find symbol b.bark(); ^ symbol: method bark() location: variable b of type Animal 1 error
Эта программа выдаст ошибку времени компиляции, так как ссылочный тип b Animal не имеет метода с именем bark.
Правила переопределения метода
-
Список аргументов должен быть точно таким же, как у переопределенного метода.
-
Тип возвращаемого значения должен быть таким же или подтипом возвращаемого типа, объявленного в исходном переопределенном методе в суперклассе.
-
Уровень доступа не может быть более строгим, чем уровень доступа переопределенного метода. Например:если метод суперкласса объявлен общедоступным, то переопределяющий метод в подклассе не может быть ни закрытым, ни защищенным.
-
Методы экземпляра можно переопределить только в том случае, если они унаследованы подклассом.
-
Метод, объявленный как final, не может быть переопределен.
-
Метод, объявленный статическим, не может быть переопределен, но может быть объявлен повторно.
-
Если метод не может быть унаследован, его нельзя переопределить.
-
Подкласс в том же пакете, что и суперкласс экземпляра, может переопределить любой метод суперкласса, который не объявлен закрытым или окончательным.
-
Подкласс в другом пакете может переопределять только неконечные методы, объявленные общедоступными или защищенными.
-
Метод переопределения может генерировать любые исключения uncheck, независимо от того, генерирует ли переопределенный метод исключения или нет. Однако переопределяющий метод не должен генерировать проверенные исключения, которые являются новыми или более широкими, чем те, которые объявлены переопределенным методом. Переопределяющий метод может генерировать меньшее количество исключений, чем переопределенный метод.
-
Конструкторы не могут быть переопределены.
Использование ключевого слова super
При вызове версии суперкласса переопределенного метода super используется ключевое слово.
Пример
Живая демонстрацияclass Animal { public void move() { System.out.println("Animals can move"); } } class Dog extends Animal { public void move() { super.move(); // invokes the super class method System.out.println("Dogs can walk and run"); } } public class TestDog { public static void main(String args[]) { Animal b = new Dog(); // Animal reference but Dog object b.move(); // runs the method in Dog class } }
Это даст следующий результат —
Вывод
Animals can move Dogs can walk and run
java
- Операторы Java
- Java-интерфейс
- Метод String Length() в Java:как найти на примере
- Метод Java String indexOf() с подстрокой и примерами
- Метод Java String charAt() с примером
- Метод Java String compareTo():как использовать с примерами
- Строка Java содержит () Метод | Проверить подстроку с примером
- Метод Java String endWith() с примером
- Java String replace(), replaceAll() и replaceFirst()
- Статическая переменная в Java:что такое статический блок и метод [пример]