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

Ключевое слово super Java

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

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

Прежде чем изучать ключевое слово super, убедитесь, что вы уже знаетеJava наследование.

Использование ключевого слова super

  1.  Вызов переписанного метода родительского класса в подклассе.

  2. Если у суперкласса (superclass) и подкласса (subclass) есть свойства с одинаковыми именами, то доступ к свойствам суперкласса (полю).

  3. Прямой вызов неопределенного или параметризованного конструктора суперкласса из конструктора подкласса.

  Давайте рассмотрим все эти用途.

1. Доступ к переписанным методам суперкласса

Если в суперклассе и подклассе определен одинаковый метод, то метод в подклассе перекрывает метод в суперклассе. Это называетсяПерепись методов.

Пример 1: перепись методов

class Animal {
  // Метод
  public void display(){
    System.out.println("I am an animal");
  }
}
class Dog extends Animal {
  // Переписанный метод
  @Override
  public void display(){
    System.out.println("Я собака");
  }
  public void printMessage(){
    display();
  }
}
class Main {
  public static void main(String[] args) {
    Dog dog1 = new Dog();
    dog1.printMessage();
  }
}

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

Я собака

В этом примере, создав объект класса Dog dog1, мы можем вызвать его метод printMessage(), после чего этот метод выполняет команду display().

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

Что делать, если нужно вызвать переписанный метод суперкласса?

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

Пример 2: вызов метода суперкласса с помощью super

class Animal {
  // Метод
  public void display(){
    System.out.println("I am an animal");
  }
}
class Dog extends Animal {
  // Переписанный метод
  @Override
  public void display(){
    System.out.println("Я собака");
  }
  public void printMessage(){
    // Это вызывает переписанный метод
    display();
    // Это вызывает метод родительского класса
    super.display();
  }
}
class Main {
  public static void main(String[] args) {
    Dog dog1 = new Dog();
    dog1.printMessage();
  }
}

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

Я собака
I am an animal

Вот как работает этот вышеупомянутый код.

2. Доступ к свойствам суперкласса (родителя)

Суперкласс и подкласс могут иметь свойства с одинаковыми именами. Мы используем ключевое слово super для доступа к свойствам суперкласса.

Пример 3: доступ к свойствам суперкласса

class Animal {
  protected String type="Животное";
}
class Dog extends Animal {
  public String type="Млекопитающие";
  public void printType() {
    System.out.println("Я " + type);
    System.out.println("Я是一只 " + super.type);
  }
}
class Main {
  public static void main(String[] args) {
    Dog dog1 = new Dog();
    dog1.printType();
  }
}

Вывод:

Я млекопитающее
Я животное

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

внутри функции printType()

  • type - это свойство подкласса Dog.

  • super.type - это свойство суперкласса Animal.

Таким образом, System.out.println("Я " + type);вывод "Я млекопитающее"и, System.out.println("Я животное " + super.type); выводитсявывод "Я животное".

3. Использование super() для доступа к конструктору суперкласса

Всем известно, что при создании объекта класса автоматически вызывается его default конструктор.

Чтобы явно вызвать конструктор суперкласса из конструктора подкласса, мы используем super(). Это особая форма ключевого слова super.

Внимание: super() может использоваться только в конструкторе подкласса и должно быть первым выражением.

Пример 4: использование super()

class Animal {
  //default или параметризованный конструктор класса Animal
  Animal() {
    System.out.println("I am an animal");
  }
}
class Dog extends Animal {
  //default или параметризованный конструктор класса Dog
  Dog() {
    //вызов по умолчанию суперкласса
    super();
    System.out.println("Я собака");
  }
}
class Main {
  public static void main(String[] args) {
    Dog dog1 = new Dog();
  }
}

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

I am an animal
Я собака

здесь, когда объект класса Dog dog1 создается, он автоматически вызывает его default или параметризованный конструктор.
в конструкторе подкласса, команда super() вызывает конструктор суперкласса и выполняет инструкции в нем. Таким образом, мы получаем результат"I am an animal".

затем поток программы возвращается в конструктор подкласса и выполняет оставшиеся инструкции. Таким образом, выводится "I am a dog".

но не обязательно использовать super(). Даже если super() не используется в конструкторе подкласса, компилятор автоматически вызовет默认ный конструктор суперкласса.

тогда, если компилятор автоматически вызывает super(), почему нужно явно его использовать и писать избыточный код?

если необходимо вызвать конструктор суперкласса из конструктора подклассапараметризованный конструктор (конструктор с параметрами)тогда, если компилятор автоматически вызывает super(), почему нужно явно его использовать и писать избыточный код?

с параметрами super()должно всегда бытьтело конструктора подклассав которомпервый语句в противном случае, возникнет компиляторная ошибка.

Пример 5: использование super() для вызова параметризованного конструктора

class Animal {
  //默认或无参数的构造函数
  Animal() {
    System.out.println("I am an animal");
  }
  //参数化构造函数
  Animal(String type) {
    System.out.println("Тип: " + type);}}
  }
}
class Dog extends Animal {
  // По умолчанию конструктор
  Dog() {
    // Вызов параметризованного конструктора суперкласса
    super("Animal");
    System.out.println("Я собака");
  }
}
class Main {
  public static void main(String[] args) {
    Dog dog1 = new Dog();
  }
}

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

Тип: Animal
Я собака

Компилятор может автоматически вызывать безparameterный конструктор. Но он не может вызывать параметризованный конструктор.

Если необходимо вызвать параметризованный конструктор,则需要 явно определить его в конструкторе подкласса, как в приведенном выше коде:

super("Animal");

Обратите внимание, что в приведенном выше примере мы использовали super("Animal") для явного вызова параметризованного конструктора. В этом случае компилятор не вызовет по умолчанию конструктор суперкласса.