English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основной курс Java

Java Управление потоком

Java Массивы

Java Ориентированное на объекты (I)

Java Ориентированное на объекты (II)

Java Ориентированное на объекты (III)

Обработка исключений Java

Java Списки (List)

Java Queue (очередь)

Java Map коллекции

Java Set коллекции

Java Вход/Выход (I/O)

Java Reader/Writer

Другие темы Java

Переписывание методов Java

В данном курсе мы с помощью примеров будем изучать метод переписывания методов в Java.

В предыдущем курсе мы изучили наследование. Наследование — это свойство OOP, которое позволяет нам выводить новый класс (subclasses) из существующего класса (суперкласса), при этом subclasses наследует свойства и методы суперкласса.

Если в суперклассе и subclasses определен один и тот же метод, то метод subclasses будет заменять метод суперкласса. Это называется переопределением методов (переписывание методов).

Пример 1: Переопределение методов

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

Правила переработки Java

  • Родительский и подклассы должны иметь одинаковые имена методов, одинаковые типы возвращаемых значений и одинаковые списки параметров.

  • Мы не можем перерабатывать методы, объявленные как final и static.

  • Мы всегда должны перерабатывать абстрактные методы суперкласса (об этом будет рассказано в以后的 уроках).

Ключевое слово super в переработке Java

Одна из наиболее частых проблем, возникающих при выполнении переработки в Java:

 Можем ли мы получить доступ к методам суперкласса после переработки?

Ответ:Да. Для доступа к методам суперкласса из подкласса мы используем ключевое слово super.

Пример 2: Использование ключевого слова 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.

Пример 3: Переопределение доступа

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 абстрактные классы создаются в качестве родительских классов (родительских классов) для других классов. И если класс содержит абстрактные методы, то его необходимо переопределить.

В последующих уроках мы рассмотрим больше информации о переопределении абстрактных классов и методов.