English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В данном курсе мы с помощью примеров будем изучать метод переписывания методов в Java.
В предыдущем курсе мы изучили наследование. Наследование — это свойство OOP, которое позволяет нам выводить новый класс (subclasses) из существующего класса (суперкласса), при этом subclasses наследует свойства и методы суперкласса.
Если в суперклассе и subclasses определен один и тот же метод, то метод subclasses будет заменять метод суперкласса. Это называется переопределением методов (переписывание методов).
class Animal { public void displayInfo() { System.out.println("Я являюсь животным."); } } class Dog extends Animal { @Override public void displayInfo() { System.out.println("Я являюсь собакой."); } } class Main {}} public static void main(String[] args) { Dog d1 = new Dog(); d1.displayInfo(); } }
Вывод:
Я собака.
В данном примере метод displayInfo() существует как в суперклассе Animal, так и в subclasses Dog.
Когда мы вызываем метод displayInfo() объекта d1 (объекта subclasses), вызывается метод subclasses Dog. Метод displayInfo() subclasses覆盖 суперкласса.
Внимание, что в нашем примере используется комментарий @Override. В Java комментарии — это метаданные, которые мы используем для предоставления информации компилятору. Здесь комментарий @Override информирует компилятор о том, что метод после этого комментария будет заменять метод суперкласса.
Использование @Override не является обязательным. Но когда мы используем этот метод, он должен следовать всем правилам переработки. В противном случае компилятор будет генерировать ошибки.
Родительский и подклассы должны иметь одинаковые имена методов, одинаковые типы возвращаемых значений и одинаковые списки параметров.
Мы не можем перерабатывать методы, объявленные как final и static.
Мы всегда должны перерабатывать абстрактные методы суперкласса (об этом будет рассказано в以后的 уроках).
Одна из наиболее частых проблем, возникающих при выполнении переработки в Java:
Можем ли мы получить доступ к методам суперкласса после переработки?
Ответ:Да. Для доступа к методам суперкласса из подкласса мы используем ключевое слово super.
class Animal { public void displayInfo() { System.out.println("Я являюсь животным."); } } class Dog extends Animal { public void displayInfo() { super.displayInfo(); System.out.println("Я являюсь собакой."); } } class Main {}} public static void main(String[] args) { Dog d1 = new Dog(); d1.displayInfo(); } }
Вывод:
Я являюсь животным. Я собака.
В этом примере подкласс Dog переопределил метод displayInfo() суперкласса Animal.
Когда мы вызываем метод displayInfo() объекта d1 класса Dog, вызывается метод внутри класса Dog. Не вызывается метод в родительском классе.
Внутри displayInfo() класса Dog мы используем super.displayInfo() для вызова displayInfo() родительского класса.
Следует отметить, что конструкторы в Java не наследуются. Поэтому в Java не существует таких проблем, как переработка конструкторов.
Но мы можем вызывать конструкторы суперкласса из его подкласса. Для этого мы используем super(). Для получения дополнительной информации обратитесь наКлючевое слово super в Java.
Одно и то же метод в родительском и подклассе может иметь разные обозначения доступа. Но есть одно ограничение.
Мы можем использовать только те обозначения доступа, которые предоставляют доступ к родительскому классу с более высоким уровнем доступа. Например,
Предположим, что метод myClass() в родительском классе объявлен как protected. Затем, метод myClass() в подклассе может быть public или protected, но не private.
class Animal { protected void displayInfo() { System.out.println("Я являюсь животным."); } } class Dog extends Animal { public void displayInfo() { System.out.println("Я являюсь собакой."); } } class Main {}} public static void main(String[] args) { Dog d1 = new Dog(); d1.displayInfo(); } }
Вывод:
Я собака.
В примере выше подкласс Dog переопределил метод displayInfo() родительского класса Animal.
Каждый раз, когда мы вызываем displayInfo() с помощью d1 (объекта подкласса), вызывается метод внутри подкласса.
Обратите внимание, что метод displayInfo() в родительском классе Animal объявлен как защищенный (protected). Этот метод в подклассе Dog имеет общедоступный индикатор доступа (public). Это разрешено, потому что public предоставляет большую доступность, чем protected.
В Java абстрактные классы создаются в качестве родительских классов (родительских классов) для других классов. И если класс содержит абстрактные методы, то его необходимо переопределить.
В последующих уроках мы рассмотрим больше информации о переопределении абстрактных классов и методов.