Wann benutze ich super ()?

80

Ich lerne gerade in meinem Java-Kurs etwas über Klassenvererbung und verstehe nicht, wann ich den super()Aufruf verwenden soll.

Bearbeiten:
Ich habe dieses Beispiel für Code gefunden, in dem verwendet wird:super.variable

class A
{
    int k = 10;
}

class Test extends A
{
    public void m() {
        System.out.println(super.k);
    }
}

Ich verstehe also, dass Sie hier verwenden müssen, superum auf die kVariable in der Superklasse zuzugreifen . Was macht super();es jedoch in jedem anderen Fall ? Allein?

muttley91
quelle
29
Tatsächlich ist in diesem Beispiel superkeine Referenz erforderlich k. kkann direkt referenziert werden. superDer Zugriff wäre nur erforderlich, A.kwenn Sie ein anderes Feld mit dem Namen kin Test( Test.k) deklariert hätten .
Mark Peters

Antworten:

142

Genaues Anrufen super() ist immer überflüssig. Es wird explizit das getan, was implizit anders gemacht würde. Dies liegt daran, dass der Super-Konstruktor ohne Argumente ohnehin automatisch aufgerufen wird, wenn Sie den Super-Konstruktor nicht aufrufen. Um nicht zu sagen, dass es ein schlechter Stil ist; Manche Leute mögen es explizit zu sein.

Es ist jedoch nützlich, wenn der Superkonstruktor Argumente verwendet, die Sie aus der Unterklasse übergeben möchten.

public class Animal {
   private final String noise;
   protected Animal(String noise) {
      this.noise = noise;
   }

   public void makeNoise() {
      System.out.println(noise);
   }
}

public class Pig extends Animal {
    public Pig() {
       super("Oink");
    }
}
Mark Peters
quelle
2
Angenommen, eine Methode wird in einer untergeordneten Klasse überschrieben und dann in ihrer untergeordneten Klasse erneut überschrieben. (Mehrstufige Vererbung) Was ist, wenn wir eine Methode des Großelternteils und des Elternteils gleichzeitig in die Klasse der Enkelkinder aufnehmen müssen? Wie würde der Super benutzt werden?
H8pathak
1
@ h8pathak: Wenn Sie fragen, wie eine untergeordnete Klasse die Implementierung ihrer übergeordneten Klasse umgehen kann, aber den Großelternteil anrufen, ist dies in Java nicht möglich.
Mark Peters
43

superverwendet , um die zu nennen constructor, methodsund propertiesder übergeordneten Klasse.

Zain Shaikh
quelle
22

Sie können das superSchlüsselwort auch in der Unterklasse verwenden, wenn Sie eine Methode aus der übergeordneten Klasse aufrufen möchten, wenn Sie sie in der Unterklasse überschrieben haben.

Beispiel:

public class CellPhone {
    public void print() {
        System.out.println("I'm a cellphone");
    }
}

public class TouchPhone extends CellPhone {
    @Override
    public void print() {
        super.print();
        System.out.println("I'm a touch screen cellphone");
    }
    public static void main (strings[] args) {
        TouchPhone p = new TouchPhone();
        p.print();
    }
}

Hier super.print()ruft die Zeile die print()Methode der Oberklasse auf CellPhone. Die Ausgabe wird sein:

I'm a cellphone
I'm a touch screen cellphone
Dhiraj Shekar
quelle
War es (String [] args) in Ihrer Hauptmethodendeklarationszeile? Vielen Dank!
Appalachian Math
9

Wenn Sie möchten, dass der Superklassenkonstruktor aufgerufen wird, um die darin enthaltenen Felder zu initialisieren. In diesem Artikel erfahren Sie, wann Sie ihn verwenden müssen:

http://download.oracle.com/javase/tutorial/java/IandI/super.html

Jon
quelle
4
Wie es in dem Link sagt, man kann nie haben zu nennen super(), wie Java implizit hinzufügen. Sie müssen jedoch aufrufen, super(args)wenn Sie einen nicht standardmäßigen übergeordneten Konstruktor benötigen.
Michael Brewer-Davis
8

Sie würden es als erste Zeile eines Unterklassenkonstruktors verwenden, um den Konstruktor seiner übergeordneten Klasse aufzurufen.

Beispielsweise:

public class TheSuper{
    public TheSuper(){
        eatCake();
    }
}

public class TheSub extends TheSuper{
    public TheSub(){
        super();
        eatMoreCake();
    }
}

Das Erstellen einer Instanz von TheSubwürde sowohl eatCake()als auch aufrufeneatMoreCake()

TartanLlama
quelle
1

Sie können es verwenden, um die Methode einer Oberklasse aufzurufen (z. B. wenn Sie eine solche Methode überschreiben, super.foo () usw.). Auf diese Weise können Sie diese Funktionalität beibehalten und mit allem, was Sie sonst noch in der Überschreibung haben, ergänzen Methode.

AHungerArtist
quelle
1

Sie rufen super()auf, um speziell einen Konstruktor Ihrer Oberklasse auszuführen. Da eine Klasse mehrere Konstruktoren haben, können Sie entweder einen bestimmten Konstruktor aufrufen mit super()oder super(param,param)oder Sie können Java Griff lassen , dass und rufen Sie den Standard - Konstruktor. Denken Sie daran, dass Klassen, die einer Klassenhierarchie folgen, der "is-a" -Beziehung folgen.

0xCAFEBABE
quelle
0

Die erste Zeile des Konstruktors Ihrer Unterklasse muss ein Aufruf sein, super()um sicherzustellen, dass der Konstruktor der Oberklasse aufgerufen wird.

Robev
quelle
Nicht wahr. Es wird automatisch passieren.
Mark Peters
Auch wenn es keinen Standardkonstruktor gibt? Woher weiß es, was zu passieren ist?
Robev
Wenn es keinen Standardkonstruktor gibt, müssen Sie super(some args)nicht aufrufen super(). Aber der Punkt ist, "muss" ist falsch. Einer der Konstruktoren der Superklasse wird garantiert aufgerufen, solange die Klasse kompiliert wird.
Mark Peters
Ich habe nicht klargestellt, dass ich beim Schreiben von super () keinen Konstruktor ohne Parameter gemeint habe, sondern einfach keine Lust hatte, einen zu schreiben. Und ja, ich meinte, du musst es aufrufen oder es wird nicht kompiliert, deshalb habe ich gesagt, muss.
Robev
1
Auch hier benötigen Sie KEINEN expliziten Aufruf eines Superkonstruktors, wenn in der übergeordneten Klasse ein Konstruktor ohne Argumente vorhanden ist. Ein Superkonstruktor wird immer aufgerufen, während Ihre Phrasierung den Eindruck erweckt, dass Sie in Gefahr sind, dass ein Superkonstruktor nicht aufgerufen wird, wenn Sie ihn nicht eingeben super(...). Es besteht absolut keine Gefahr dafür. nur Gefahr, dass es nicht kompiliert wird.
Mark Peters
0

Ich habe es gerade versucht und super () kommentiert; macht das Gleiche, ohne es zu kommentieren, wie @Mark Peters sagte

package javaapplication6;

/**
 *
 * @author sborusu
 */
public class Super_Test {
    Super_Test(){
        System.out.println("This is super class, no object is created");
    }
}
class Super_sub extends Super_Test{
    Super_sub(){
       super();
       System.out.println("This is sub class, object is created");
    }
    public static void main(String args[]){
        new Super_sub();
    }
}
Shiva Borusu
quelle
0

Von der Oracle - Dokumentation Seite :

Wenn Ihre Methode eine der Methoden ihrer Oberklasse überschreibt, können Sie die überschriebene Methode mithilfe des Schlüsselworts aufrufen super.

Sie können auch verwenden super, um auf ein verstecktes Feld zu verweisen (obwohl das Ausblenden von Feldern nicht empfohlen wird).

Verwendung superim Konstruktor von Unterklassen:

Der Aufruf eines Superklassenkonstruktors muss die erste Zeile im Unterklassenkonstruktor sein.

Die Syntax zum Aufrufen eines Konstrukts der Oberklasse lautet

super();  

oder:

super(parameter list);

Mit super()wird der Konstruktor der Superklasse ohne Argumente aufgerufen. Mit super(parameter list)wird der Superklassenkonstruktor mit einer übereinstimmenden Parameterliste aufgerufen.

Hinweis: Wenn ein Konstruktor einen Superklassenkonstruktor nicht explizit aufruft, fügt der Java-Compiler automatisch einen Aufruf an den Konstruktor ohne Argumente der Superklasse ein . Wenn die Superklasse keinen Konstruktor ohne Argumente hat, wird ein Fehler zur Kompilierungszeit angezeigt.

In Verbindung stehender Beitrag:

Polymorphismus vs Überschreiben vs Überladen

Ravindra Babu
quelle