Spec-Zone .ru
спецификации, руководства, описания, API
След: Изучение Языка Java
Урок: Интерфейсы и Наследование
Раздел: Наследование
Переопределение и Сокрытие Методов
Домашняя страница > Изучение Языка Java > Интерфейсы и Наследование

Переопределение и Сокрытие Методов

Методы экземпляра

Метод экземпляра в подклассе с той же самой подписью (имя, плюс число и тип его параметров) и тип возврата как метод экземпляра в суперклассе переопределяет метод суперкласса.

Возможность подкласса переопределить метод позволяет 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 в подклассе, и наоборот.

Сводка

Следующая таблица суммирует то, что происходит, когда Вы определяете метод с помощью той же самой подписи как метод в суперклассе.

Определение Метода с Той же самой Подписью как Метод Суперкласса
  Метод экземпляра суперкласса Суперкласс Статический Метод
Разделите Метод экземпляра на подклассы Переопределения Генерирует ошибку времени компиляции
Разделите Статический Метод на подклассы Генерирует ошибку времени компиляции Скрывается

Отметьте: В подклассе можно перегрузить методы, наследованные от суперкласса. Такие перегруженные методы ни не скрывают, ни переопределяют методы суперкласса — они - новые методы, уникальные для подкласса.

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Наследование
Следующая страница: Полиморфизм