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

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

В superключова дума в Java се използва в подкласове за достъп суперкласа членовете (атрибути, конструктори и методи).

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

Използване на супер ключова дума

  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 to Call Superclass

 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()функцията,

  • тип се отнася до атрибута на подкласа 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, той автоматично извиква конструктора по подразбиране или no-arg на този клас.

Вътре в конструктора на подклас 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(); ) ) 

Изход

 Тип: Животно Аз съм куче 

Компилаторът може автоматично да извика конструктора no-arg. Той обаче не може да извика параметризирани конструктори.

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

Имайте предвид, че в горния пример изрично извикахме параметризирания конструктор super("Animal"). В този случай компилаторът не извиква конструктора по подразбиране на суперкласа.

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