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 с помощью примеров.

Создание наследования — одна из важнейших функций ООП (ориентированного на объекты программирования), которая позволяет нам определять новый класс на основе существующего. Например:

class Animal
}
    // метод eat()
    // метод sleep()
}
class Dog extends Animal
}
    // bark() метод
}

В Java мы используем ключевое слово extends для наследования от класса. Здесь, мы наследуем класс Dog от класса Animal.

Animal является суперклассом (родительским классом или базовым классом), а Dog является подклассом (дочерним классом или производным классом). Подкласс наследует поля и методы суперкласса.

Отношение is-a

Наследование являетсяis-aОтношения, мы используем наследование только когда два класса имеют отношение is-a.

Вот несколько примеров:

  • Автомобиль является транспортным средством.

  • Оранжевый является фрукт.

  • Хирург является врачом.

  • Собака является животным.

Пример 1: Наследование Java

class Animal {
   public void eat() {
      System.out.println("Я могу есть");
   }
   public void sleep() {
      System.out.println("Я могу спать");
   }
}
class Dog extends Animal {
   public void bark() {
      System.out.println("Я могу лаять");
   }
}
class Main {
   public static void main(String[] args) {
      Dog dog1 = new Dog();
      dog1.eat();
      dog1.sleep();
      dog1.bark();
   }
}

Результат вывода

Я могу есть
Я могу спать
Я могу лаять

Здесь, мы наследуем класс Dog из класса Animal.  Класс Dog наследует методы eat() и sleep() от класса Animal.

Таким образом, объекты класса Dog могут访问 члены класса Dog и Animal.

Ключевое слово protected

Мы уже рассмотрели модификаторы доступа private и public в предыдущем уроке.

  • Члены private могут быть доступны только в классе

  • Публичные члены могут быть доступны из любого места

Вы также можете установить методы и поля как protected, защищенные члены могут быть доступны

  • Внутри класса

  • В подклассе

  • Внутри одного пакета

Это резюме, в котором можно посетить модификаторы доступа.

МодификаторКласс
Пакет
Дочерний классГлобальный
publicДаДаДаДа
privateДаНетНетНет
protectedДаДаДаНет

Пример 2: ключевой слово protected

class Animal {
   protected String type;
   private String color;
   public void eat() {
      System.out.println("Я могу есть");
   }
   public void sleep() {
      System.out.println("Я могу спать");
   }
   public String getColor(){
      return color;
   }
   public void setColor(String col){
      color = col;
   }
}
class Dog extends Animal {
   public void displayInfo(String c){
      System.out.println("Я " + type);
      System.out.println("Мой цвет " + c);
   }
   public void bark() {
      System.out.println("Я могу лаять");
   }
}
class Main {
   public static void main(String[] args) {
      Dog dog1 = new Dog();
      dog1.eat();
      dog1.sleep();
      dog1.bark();
 
      dog1.type = "mammal";
      dog1.setColor("black");
      dog1.displayInfo(dog1.getColor()); 
   }
}

Результат вывода

Я могу есть
Я могу спать
Я могу лаять
Я млекопитающее
Мой цвет черный

Здесь, полей типа в классе Animal защищены. Мы уже访问или это поле из класса Main

dog1.type = "mammal";

Это可实现, 因为Animal и Main классы находятся в одном пакете (в одном файле).

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

Из上面的 примера我们知道, что объект подкласса также может вызывать методы своего суперкласса.

 Что会发生, если в суперклассе и подклассе определен один и тот же метод?

Хорошо, в этом случае метод в подклассе заменяет метод в суперклассе. Например,

Пример 3: пример переписывания/замены методов

class Animal {
   protected String type = "animal";
   public void eat() {
      System.out.println("Я могу есть");
   }
   public void sleep() {
      System.out.println("Я могу спать");
   }
}
class Dog extends Animal {
  
   @Override
   public void eat() {
      System.out.println("Я ечу корм для собак");
   }
   public void bark() {
      System.out.println("Я могу лаять");
   }
}
class Main {
   public static void main(String[] args) {
      Dog dog1 = new Dog();
      dog1.eat();
      dog1.sleep();
      dog1.bark();
   }
}

Результат вывода

Я ечу корм для собак
Я могу спать
Я могу лаять

Здесь метод eat() появляется как в суперклассе Animal, так и в подклассе Dog. Мы создали объект подкласса Dog dog1.

Когда мы вызываем метод eat() через объект dog1, вызывается метод в Dog, а не метод в суперклассе. Это называется переписыванием методов.

В上面的 программе мы использовали аннотацию @Override, чтобы сообщить компилятору, что мы переписываем метод. Но это не обязательно. В следующем уроке мы详细了解Переписывание методов.

Если нужно вызывать метод eat() из подкласса Animal, используйте ключевое слово super.

Пример 4: ключевое слово super

class Animal {
   public Animal() {
     System.out.println("Я животное");
   }
   public void eat() {
     System.out.println("Я могу есть");
   }
}
class Dog extends Animal {
   public Dog(){
      super();
      System.out.println("Я собака");
   }
  @Override
  public void eat() {
     super.eat();
     System.out.println("Я ечу корм для собак");
  }
   public void bark() {
      System.out.println("Я могу лаять");
   }
}
class Main {
   public static void main(String[] args) {
      Dog dog1 = new Dog();
      dog1.eat();
      dog1.bark();
   }
}

Результат вывода

Я животное
Я собака
Я могу есть
Я ечу корм для собак
Я могу лаять

Здесь мы используем суперключ super() для вызова конструктора. Кроме того, мы используем super.eat() для вызова метода eat() суперкласса Animal.

Внимание: различие в вызове конструктора и super метода. Для получения更多信息 посетитеJava суперключ.

Типы наследования

Наследование имеет пять типов.

  • Единственное наследование - Класс B наследуется только от класса A.

  • Многоуровневое наследование - Класс B наследуется от класса A, затем класс C наследуется от класса B.

  • Уровневое наследование - Класс A является родителем для B, C и D.

  • Множественное наследование - Класс C наследуется от интерфейса A и расширяется B.

  • Комбинированное наследование - Два или несколько.Наследование.Комбинированное.

Java не поддерживает множественное наследование классов и комбинированное наследование. Однако мы можем реализовать множественное наследование в Java через интерфейсы. Мы узнаем о интерфейсах в后面的 главах.

Почему использовать наследование?

  • Самое важное применение - это повторное использование кода. Код, существующий в суперклассе, не нужно повторно писать в подклассе.

  • С помощью метода перегрузки достигается многообразие в czasie выполнения. В后面的 главах мы будем изучать больше о полиморфизме.