Супер ключевое слово Java (с примерами)

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

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

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

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

  1. Для вызова методов суперкласса, переопределенного в подклассе.
  2. Для доступа к атрибутам (полям) суперкласса, если и суперкласс, и подкласс имеют атрибуты с одинаковыми именами.
  3. Для явного вызова суперкласса no-arg (по умолчанию) или параметризованного конструктора из конструктора подкласса.

Давайте разберемся в каждом из этих вариантов использования.

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

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

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

 class Animal ( // overridden method public void display()( System.out.println("I am an animal"); ) ) class Dog extends Animal ( // overriding method @Override public void display()( System.out.println("I am a dog"); ) public void printMessage()( display(); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); dog1.printMessage(); ) ) 

Вывод

 я собака 

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

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

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

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

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

 class Animal ( // overridden method public void display()( System.out.println("I am an animal"); ) ) class Dog extends Animal ( // overriding method @Override public void display()( System.out.println("I am a dog"); ) public void printMessage()( // this calls overriding method display(); // this calls overridden method super.display(); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); dog1.printMessage(); ) ) 

Вывод

 Я собака я животное 

Вот как работает вышеуказанная программа.

2. Атрибуты доступа суперкласса

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

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

 class Animal ( protected String; ) class Dog extends Animal ( public String; public void printType() ( System.out.println("I am a " + type); System.out.println("I am an " + super.type); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); dog1.printType(); ) ) 

Выход :

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

В этом примере мы определили один и тот же тип поля экземпляра как в суперклассе Animal, так и в подклассе Dog.

Затем мы создали объект dog1 класса Dog. Затем printType()вызывается метод с использованием этого объекта.

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

  • type относится к атрибуту подкласса Dog.
  • super.type относится к атрибуту суперкласса Animal.

Следовательно, System.out.println("I am a " + type);отпечатки я - млекопитающее. И, System.out.println("I am an " + super.type);отпечатки, я животное.

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

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

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

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

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

 class Animal ( // default or no-arg constructor of class Animal Animal() ( System.out.println("I am an animal"); ) ) class Dog extends Animal ( // default or no-arg constructor of class Dog Dog() ( // calling default constructor of the superclass super(); System.out.println("I am a dog"); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); ) ) 

Вывод

 Я животное я собака 

Здесь, когда создается объект dog1 класса Dog, он автоматически вызывает конструктор по умолчанию или конструктор без аргументов этого класса.

Внутри конструктора подкласса super()оператор вызывает конструктор суперкласса и выполняет операторы внутри него. Отсюда получаем вывод «Я животное».

Затем поток программы возвращается к конструктору подкласса и выполняет оставшиеся операторы. Таким образом, я собака будет напечатана.

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

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

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

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

Пример 5: Вызов параметризованного конструктора с помощью super ()

 class Animal ( // default or no-arg constructor Animal() ( System.out.println("I am an animal"); ) // parameterized constructor Animal(String type) ( System.out.println("Type: "+type); ) ) class Dog extends Animal ( // default constructor Dog() ( // calling parameterized constructor of the superclass super("Animal"); System.out.println("I am a dog"); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); ) ) 

Вывод

 Тип: Животное Я собака 

Компилятор может автоматически вызывать конструктор без аргументов. Однако он не может вызывать параметризованные конструкторы.

Если необходимо вызвать параметризованный конструктор, нам нужно явно определить его в конструкторе подкласса.

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

Интересные статьи...