Super klíčové slovo Java (s příklady)

V tomto tutoriálu se pomocí příkladů dozvíme super klíčové slovo v Javě.

superKlíčové slovo v Javě je používán v podtřídách pro přístup k supertřídu členů (atributy, konstruktéry a metod).

Než se seznámíme s superklíčovým slovem, nezapomeňte vědět o dědičnosti Java.

Použití super klíčového slova

  1. Volání metod nadtřídy, která je přepsána v podtřídě.
  2. Přístup k atributům (polím) nadtřídy, pokud má nadtřída i podtřída atributy se stejným názvem.
  3. Chcete-li explicitně volat nadtřídu no-arg (výchozí) nebo parametrizovaný konstruktor z konstruktoru podtřídy.

Pochopme každé z těchto použití.

1. Přístup k přepsaným metodám nadtřídy

Pokud jsou metody se stejným názvem definovány v nadtřídě i podtřídě, přepíše metoda v podtřídě metodu v nadtřídě. Tomu se říká přepsání metody.

Příklad 1: Přepsání metody

 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(); ) ) 

Výstup

 jsem pes 

V tomto příkladu vytvořením objektu dog1 třídy Dog můžeme zavolat jeho metodu printMessage (), která poté provede display()příkaz.

Protože display()je definována v obou třídách, metoda podtřídy Dog přepíše metodu nadtřídy Animal. Proto display()se nazývá podtřída.

Co když je třeba volat přepsanou metodu nadtřídy?

Používáme, super.display()pokud je display()třeba volat přepsanou metodu nadtřídy Animal.

Příklad 2: Super to Call Superclass Method

 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(); ) ) 

Výstup

 Jsem pes, jsem zvíře 

Zde funguje výše uvedený program.

2. Přístup k atributům nadtřídy

Nadtřída a podtřída mohou mít atributy se stejným názvem. superKlíčové slovo používáme pro přístup k atributu nadtřídy.

Příklad 3: Přístup k atributu nadtřídy

 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(); ) ) 

Výstup :

 Jsem savec, jsem zvíře 

V tomto příkladu jsme definovali stejný typ pole instance jak v nadtřídě Animal, tak v podtřídě Dog.

Poté jsme vytvořili objekt dog1 třídy Dog. Potom se printType()metoda volá pomocí tohoto objektu.

Uvnitř printType()funkce

  • type odkazuje na atribut podtřídy Dog.
  • super.typ odkazuje na atribut nadtřídy Zvíře.

Proto, System.out.println("I am a " + type);otisky, jsem savec. A System.out.println("I am an " + super.type);otisky jsem zvíře.

3. Použití super () pro přístup ke konstruktoru nadtřídy

Jak víme, když je vytvořen objekt třídy, je automaticky volán jeho výchozí konstruktor.

Chcete-li explicitně volat konstruktor nadtřídy z konstruktoru podtřídy, použijeme super(). Je to speciální forma superklíčového slova.

super() lze použít pouze uvnitř konstruktoru podtřídy a musí to být první příkaz.

Příklad 4: Použití 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(); ) ) 

Výstup

 Jsem zvíře, jsem pes 

Tady, když je vytvořen objekt dog1 třídy Dog, automaticky volá výchozí konstruktor nebo no-arg dané třídy.

Uvnitř konstruktoru podtřídy super()volá příkaz konstruktor nadtřídy a provádí v něm příkazy. Proto dostaneme výstup, že jsem zvíře.

Tok programu se poté vrátí zpět do konstruktoru podtřídy a provede zbývající příkazy. Takže jsem pes bude vytištěn.

Používání super()však není povinné. I když super()se v konstruktoru podtřídy nepoužívá, kompilátor implicitně volá výchozí konstruktor nadtřídy.

Proč tedy používat redundantní kód, pokud kompilátor automaticky vyvolá super ()?

Je vyžadováno, pokud má být konstruktor parametru (konstruktor, který přijímá argumenty) nadtřídy volán z konstruktoru podtřídy.

Parametrizovaný super()musí být vždy první příkaz v těle konstruktoru podtřídy, jinak dostaneme chybu kompilace.

Příklad 5: Volání parametrizovaného konstruktoru pomocí 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(); ) ) 

Výstup

 Typ: Zvíře Jsem pes 

Kompilátor může automaticky volat konstruktor no-arg. Nemůže však volat parametrizované konstruktory.

Pokud je třeba volat parametrizovaný konstruktor, musíme jej explicitně definovat v konstruktoru podtřídy.

Všimněte si, že ve výše uvedeném příkladu jsme explicitně volali parametrizovaný konstruktor super("Animal"). Kompilátor v tomto případě nevolá výchozí konstruktor nadtřídy.

Zajímavé články...