Spec-Zone .ru
спецификации, руководства, описания, API
|
Метод экземпляра в подклассе с той же самой подписью (имя, плюс число и тип его параметров) и тип возврата как метод экземпляра в суперклассе переопределяет метод суперкласса.
Возможность подкласса переопределить метод позволяет class наследоваться от суперкласса, поведение которого "достаточно близко" и затем изменить поведение как необходимый. У метода переопределения есть то же самое имя, число и тип параметров, и тип возврата как метод, который это переопределяет. Метод переопределения может также возвратить подтип типа, возвращенного переопределенным методом. Это вызывают ковариантным типом возврата.
Переопределяя метод, Вы могли бы хотеть использовать @Override
аннотация, которая сообщает компилятору, что Вы намереваетесь переопределить метод в суперклассе. Если по некоторым причинам компилятор обнаружит, что метод не существует в одном из суперклассов, то это генерирует ошибку. Для получения дополнительной информации по @Override
, см. Annotations
.
Если подкласс определяет метод class с помощью той же самой подписи как метод class в суперклассе, метод в подклассе скрывает тот в суперклассе.
У различия между сокрытием и переопределением есть важные импликации. Версия переопределенного метода, который вызывается, является той в подклассе. Версия скрытого метода, который вызывается, зависит от того, вызывается ли это от суперкласса или подкласса. Давайте смотреть на пример, который содержит два класса. Первое Animal
, который содержит один метод экземпляра и один метод class:
public class Animal { public static void testClassMethod() { System.out.println("The class" + " method in Animal."); } public void testInstanceMethod() { System.out.println("The instance " + " method in Animal."); } }
Второй class, подкласс Animal
, вызывается Cat
:
public class Cat extends Animal { public static void testClassMethod() { System.out.println("The class method" + " in Cat."); } public void testInstanceMethod() { System.out.println("The instance method" + " in Cat."); } public static void main(String[] args) { Cat myCat = new Cat(); Animal myAnimal = myCat; Animal.testClassMethod(); myAnimal.testInstanceMethod(); } }
Cat
class переопределяет метод экземпляра в Animal
и скрывает метод class в Animal
. main
метод в этом class создает экземпляр Cat
и вызовы testClassMethod()
на class и testInstanceMethod()
на экземпляре.
Вывод из этой программы следующие:
The class method in Animal. The instance method in Cat.
Как обещающийся, версия скрытого метода, который вызывается, является той в суперклассе, и версия переопределенного метода, который вызывается, является той в подклассе.
Спецификатор доступа для метода переопределения может позволить больше, но не меньше, доступ чем переопределенный метод. Например, защищенный метод экземпляра в суперклассе может быть обнародован, но не частный, в подклассе.
Вы получите ошибку времени компиляции, если Вы попытаетесь изменить метод экземпляра в суперклассе метода class в подклассе, и наоборот.
Следующая таблица суммирует то, что происходит, когда Вы определяете метод с помощью той же самой подписи как метод в суперклассе.
Метод экземпляра суперкласса | Суперкласс Статический Метод | |
---|---|---|
Разделите Метод экземпляра на подклассы | Переопределения | Генерирует ошибку времени компиляции |
Разделите Статический Метод на подклассы | Генерирует ошибку времени компиляции | Скрывается |