super() Ruft den übergeordneten Konstruktor ohne Argumente auf.
Es kann auch mit Argumenten verwendet werden. Dh super(argument1)und es wird der Konstruktor aufgerufen, der 1 Parameter vom Typ argument1(falls vorhanden) akzeptiert .
Es kann auch verwendet werden, um Methoden vom übergeordneten Element aufzurufen. Dhsuper.aMethod()
HINWEIS: Im ersten Fall muss für die übergeordnete Klasse ein Konstruktor ohne Argumente fehlschlagen, der einen Kompilierungsfehler auslöst.
KNU
Nit: Die Eltern / Kind-Terminologie ist für Klassenhierarchien nicht sehr gut. (Ein Kind ist kein Vater.)
Aioobe
Gibt es irgendwelche Einschränkungen, wo Super verwendet werden kann?
Aaron Franke
2
@VivekChavda, sicher , ein Kind kann ein Elternteil sein, wie nur ein Student ein Lehrer sein kann, etc. Aber ich denke , Sie verstehen den Unterschied im Vergleich zu Tier -> Hund zum Beispiel. Ein Hund ist notwendigerweise ein Tier. Eltern / Kind ist in der Regel ein eine hat Beziehung ( „A Elternteil hat ein Kind“) , während ein Tier / Hund ist eine „ist eine“ Beziehung. Siehe aioo.be/2016/06/29/a-child-is-not-always-a-parent.html
aioobe
2
@ AaronFranke, "Gibt es Einschränkungen, wo Super verwendet werden kann?" - Ja, super(...)darf nur als erste Anweisung in einem Konstruktor verwendet werden.
Aioobe
154
Einige Fakten:
super() wird verwendet, um den unmittelbaren Elternteil anzurufen.
super() kann mit Instanzmitgliedern verwendet werden, dh mit Instanzvariablen und Instanzmethoden.
super() kann innerhalb eines Konstruktors verwendet werden, um den Konstruktor der übergeordneten Klasse aufzurufen.
OK, jetzt lassen Sie uns diese Punkte von praktisch umsetzen super().
Überprüfen Sie den Unterschied zwischen Programm 1 und 2. Hier belegt Programm 2 unsere erste Aussage super()in Java.
Programm 1
classBase{int a =100;}classSup1extendsBase{int a =200;voidShow(){System.out.println(a);System.out.println(a);}publicstaticvoid main(String[] args){newSup1().Show();}}
Ausgabe:
200
200
Schauen Sie sich nun Programm 2 an und versuchen Sie, den Hauptunterschied herauszufinden.
Programm 2
classBase{int a =100;}classSup2extendsBase{int a =200;voidShow(){System.out.println(super.a);System.out.println(a);}publicstaticvoid main(String[] args){newSup2().Show();}}
Ausgabe:
100
200
In Programm 1 war die Ausgabe nur von der abgeleiteten Klasse. Die Variable weder der Basisklasse noch der übergeordneten Klasse konnte gedruckt werden. In Programm 2 haben wir jedoch beim Drucken der Ausgabe eine super()Variable averwendet, und anstatt den Wert der Variablen ader abgeleiteten Klasse zu drucken, wurde der Wert der Variablen ader Basisklasse gedruckt . Es zeigt also, dass super()damit der unmittelbare Elternteil angerufen wird.
OK, überprüfen Sie jetzt den Unterschied zwischen Programm 3 und Programm 4.
Programm 3
classBase{int a =100;voidShow(){System.out.println(a);}}classSup3extendsBase{int a =200;voidShow(){System.out.println(a);}publicstaticvoidMain(String[] args){newSup3().Show();}}
Ausgabe:
200
Hier ist die Ausgabe 200. Beim Aufruf Show()wurde die Show()Funktion der abgeleiteten Klasse aufgerufen. Aber was sollen wir tun, wenn wir die Show()Funktion der Elternklasse aufrufen wollen ? Überprüfen Sie Programm 4 für die Lösung.
Programm 4
classBase{int a =100;voidShow(){System.out.println(a);}}classSup4extendsBase{int a =200;voidShow(){super.Show();System.out.println(a);}publicstaticvoidMain(String[] args){newSup4().Show();}}
Ausgabe:
100
200
Hier erhalten wir zwei Ausgaben, 100 und 200. Wenn die Show()Funktion der abgeleiteten Klasse aufgerufen wird, ruft sie zuerst die Show()Funktion der übergeordneten Klasse auf, da Show()wir innerhalb der Funktion der abgeleiteten Klasse die Show()Funktion der übergeordneten Klasse durch Putten aufgerufen haben das superSchlüsselwort vor dem Funktionsnamen.
Warum haben Sie Ihre Quellcode-Beispiele nicht eingerückt? Gibt es einen bestimmten Grund?
Erikbwork
NEIN erikb, ich möchte die Verwendung von super () wissen. Danach werde ich nur noch
Mohan
In meiner Basisklasse überlade ich den Konstruktor mit einem, zwei, ... Argumenten
Mohan
aber in meiner abgeleiteten Klasse benutze ich super () ohne Argu. Was passiert dann, wenn automatisch ein Standardkonstruktor einer Basisklasse aufgerufen wird
Mohan
2
super()ist kein Schlüsselwort. Es ist ein Konstruktoraufruf. superist ein Schlüsselwort, und # 1 und # 2 sind nur mit dieser Definition sinnvoll.
Ja. super(...)ruft den Konstruktor der Superklasse auf.
Illustration:
Eigenständiges Beispiel:
classAnimal{publicAnimal(String arg){System.out.println("Constructing an animal: "+ arg);}}classDogextendsAnimal{publicDog(){super("From Dog constructor");System.out.println("Constructing a dog.");}}publicclassTest{publicstaticvoid main(String[] a){newDog();}}
Drucke:
Constructing an animal:FromDog constructorConstructing a dog.
In meiner Basisklasse überlade ich den Konstruktor mit einem, zwei, ... Argumenten in meiner abgeleiteten Klasse. Ich benutze super () ohne Argument. Was passiert dann, wenn automatisch ein Standardkonstruktor einer Basisklasse
Mohan
Ja. Wenn Sie es aufrufen super(), wird der Konstruktor der Superklasse aufgerufen , der keine Argumente akzeptiert. In ähnlicher Weise wird der Konstruktor mit 1 Argumenten aufgerufen, wenn Sie dies tun super(arg1), und so weiter.
Aioobe
Wenn es in der Basisklasse keinen Konstruktor ohne Argument gab, was passiert dann, wenn die abgeleitete Klasse super () aufruft?
Mohan
1
Nichts. Es wird nicht kompiliert. Wenn Sie selbst einen Konstruktor angeben, wird der automatische Konstruktor / default / no-argument nicht generiert und ist daher super()kein gültiger Aufruf.
Aioobe
29
Wird super () verwendet, um den übergeordneten Konstruktor aufzurufen?
Ja.
Bitte erklären Sie über Super ().
super()ist eine spezielle Verwendung des superSchlüsselworts, bei dem Sie einen parameterlosen übergeordneten Konstruktor aufrufen. Im Allgemeinen kann das superSchlüsselwort verwendet werden, um überschriebene Methoden aufzurufen, auf versteckte Felder zuzugreifen oder den Konstruktor einer Oberklasse aufzurufen.
super()wird verwendet, um den übergeordneten Konstruktor aufzurufen, super.myMethod()wird verwendet, um eine überschriebene Methode aufzurufen.
Sean Patrick Floyd
2
@seanizer oder eine andere Methode der Oberklasse (einschließlich Statik), wenn sie im Geltungsbereich liegt. Super ist nur ein Verweis auf Ihre Basisklasse.
Atamanroman
3
Ich glaube nicht, dass super () verwendet wird, um Basisklassenmethoden aufzurufen. Sie können jedoch super.method () verwenden.
Dheeraj Joshi
@seanizer, @Dheeraj: Danke für dein Feedback, ich habe meine Antwort angepasst.
Heinzi
7
Das Aufrufen des Super-Konstruktors ohne Argumente ist nur eine Verschwendung von Bildschirmplatz und Programmierzeit. Der Compiler generiert genau den gleichen Code, unabhängig davon, ob Sie ihn schreiben oder nicht.
Einfach super (); Allein wird der Standardkonstruktor aufgerufen, wenn er in der Oberklasse einer Klasse vorhanden ist. Sie müssen den Standardkonstruktor jedoch explizit selbst schreiben. Wenn Sie kein Java ohne Implementierungen für Sie generieren, speichern Sie super (). Dies bezieht sich auf das universelle Superklassenobjekt und kann nicht in einer Unterklasse aufgerufen werden.
publicclassAlien{publicAlien(){//Default constructor is written out by user/** Implementation not shown…**/}}publicclassWeirdAlienextendsAlien{publicWeirdAlien(){super();//calls the default constructor in Alien.}}
Ich möchte mit Codes teilen, was ich verstanden habe.
Das Super-Schlüsselwort in Java ist eine Referenzvariable, mit der übergeordnete Klassenobjekte referenziert werden. Es wird hauptsächlich in folgenden Zusammenhängen verwendet:
1. Verwendung von Super mit Variablen:
classVehicle{int maxSpeed =120;}/* sub class Car extending vehicle */classCarextendsVehicle{int maxSpeed =180;void display(){/* print maxSpeed of base class (vehicle) */System.out.println("Maximum Speed: "+super.maxSpeed);}}/* Driver program to test */classTest{publicstaticvoid main(String[] args){Car small =newCar();
small.display();}}
Ausgabe:-
MaximumSpeed:120
Verwendung von Super mit Methoden:
/* Base class Person */classPerson{void message(){System.out.println("This is person class");}}/* Subclass Student */classStudentextendsPerson{void message(){System.out.println("This is student class");}// Note that display() is only in Student class void display(){// will invoke or call current class message() method
message();// will invoke or call parent class message() method super.message();}}/* Driver program to test */classTest{publicstaticvoid main(String args[]){Student s =newStudent();// calling display() of Student
s.display();}}
Ausgabe:-
This is student classThis is person class
3. Verwendung von Super mit Konstruktoren:
classPerson{Person(){System.out.println("Person class Constructor");}}/* subclass Student extending the Person class */classStudentextendsPerson{Student(){// invoke or call parent class constructor super();System.out.println("Student class Constructor");}}/* Driver program to test*/classTest{publicstaticvoid main(String[] args){Student s =newStudent();}}
Konstruktoren
In einem Konstruktor können Sie ihn ohne Punkt verwenden, um einen anderen Konstruktor aufzurufen. superruft einen Konstruktor in der Oberklasse auf; thisruft einen Konstruktor in dieser Klasse auf:
publicMyClass(int a){this(a,5);// Here, I call another one of this class's constructors.}publicMyClass(int a,int b){super(a, b);// Then, I call one of the superclass's constructors.}
superist nützlich, wenn sich die Oberklasse selbst initialisieren muss. thisDies ist nützlich, damit Sie den gesamten Hard-Initialisierungscode nur einmal in einen der Konstruktoren schreiben und von allen anderen, viel einfacher zu schreibenden Konstruktoren aufrufen können.
Methoden
In jeder Methode können Sie sie mit einem Punkt verwenden, um eine andere Methode aufzurufen. super.method()ruft eine Methode in der Oberklasse auf; this.method()ruft eine Methode in dieser Klasse auf:
publicString toString(){int hp =this.hitpoints();// Calls the hitpoints method in this class// for this object.String name =super.name();// Calls the name method in the superclass// for this object.return"["+ name +": "+ hp +" HP]";}
superist in einem bestimmten Szenario nützlich: Wenn Ihre Klasse dieselbe Methode wie Ihre Oberklasse hat, geht Java davon aus, dass Sie die in Ihrer Klasse haben möchten. superHier können Sie stattdessen nach der Methode der Oberklasse fragen. thisist nur nützlich, um Ihren Code besser lesbar zu machen.
Das Schlüsselwort super kann verwendet werden, um den Konstruktor der Oberklasse aufzurufen und auf ein Mitglied der Oberklasse zu verweisen
Wenn Sie anrufen super () mit den richtigen Argumenten, nennen wir tatsächlich den Konstruktor Box , die Variablen initialisiert Breite , Höhe und Tiefe , unter Verwendung der Werte der entsprechenden Parameter , um es bezeichnet. Sie müssen nur noch das Mehrwertgewicht initialisieren. Bei Bedarf können Sie jetzt die Variablen Box als privat klassifizieren . Tragen Sie in die Felder des privaten Modifikators der Box-Klasse ein und stellen Sie sicher, dass Sie problemlos darauf zugreifen können.
In der Oberklasse können sich mehrere überladene Versionskonstruktoren befinden, sodass Sie die Methode super () mit unterschiedlichen Parametern aufrufen können . Das Programm führt den Konstruktor aus, der den angegebenen Argumenten entspricht.
Super ist ein Schlüsselwort. Es wird innerhalb einer Unterklassenmethodendefinition verwendet, um eine in der Oberklasse definierte Methode aufzurufen. Private Methoden der Oberklasse können nicht aufgerufen werden. Nur öffentliche und geschützte Methoden können mit dem Schlüsselwort super aufgerufen werden. Es wird auch von Klassenkonstruktoren verwendet, um Konstruktoren der übergeordneten Klasse aufzurufen.
Wie bereits erwähnt, befindet sich im Standardkonstruktor ein implizites super (), das in der ersten Zeile des Konstruktors aufgerufen wird .
Dieses super () ruft automatisch eine Kette von Konstruktoren auf, die am Anfang der Klassenhierarchie beginnen und sich in der Hierarchie nach unten bewegen.
Wenn die Klassenhierarchie des Programms mehr als zwei Klassen enthält , wird der Standardkonstruktor der obersten Klasse zuerst aufgerufen .
Hier ist ein Beispiel dafür:
class A {
A(){System.out.println("Constructor A");}}class B extends A{public B(){System.out.println("Constructor B");}}class C extends B{public C(){System.out.println("Constructor C");}publicstaticvoid main(String[] args){
C c1 =new C();}}
Antworten:
super()
Ruft den übergeordneten Konstruktor ohne Argumente auf.Es kann auch mit Argumenten verwendet werden. Dh
super(argument1)
und es wird der Konstruktor aufgerufen, der 1 Parameter vom Typargument1
(falls vorhanden) akzeptiert .Es kann auch verwendet werden, um Methoden vom übergeordneten Element aufzurufen. Dh
super.aMethod()
Weitere Infos und Tutorial hier
quelle
super(...)
darf nur als erste Anweisung in einem Konstruktor verwendet werden.Einige Fakten:
super()
wird verwendet, um den unmittelbaren Elternteil anzurufen.super()
kann mit Instanzmitgliedern verwendet werden, dh mit Instanzvariablen und Instanzmethoden.super()
kann innerhalb eines Konstruktors verwendet werden, um den Konstruktor der übergeordneten Klasse aufzurufen.OK, jetzt lassen Sie uns diese Punkte von praktisch umsetzen
super()
.Überprüfen Sie den Unterschied zwischen Programm 1 und 2. Hier belegt Programm 2 unsere erste Aussage
super()
in Java.Programm 1
Ausgabe:
Schauen Sie sich nun Programm 2 an und versuchen Sie, den Hauptunterschied herauszufinden.
Programm 2
Ausgabe:
In Programm 1 war die Ausgabe nur von der abgeleiteten Klasse. Die Variable weder der Basisklasse noch der übergeordneten Klasse konnte gedruckt werden. In Programm 2 haben wir jedoch beim Drucken der Ausgabe eine
super()
Variablea
verwendet, und anstatt den Wert der Variablena
der abgeleiteten Klasse zu drucken, wurde der Wert der Variablena
der Basisklasse gedruckt . Es zeigt also, dasssuper()
damit der unmittelbare Elternteil angerufen wird.OK, überprüfen Sie jetzt den Unterschied zwischen Programm 3 und Programm 4.
Programm 3
Ausgabe:
Hier ist die Ausgabe 200. Beim Aufruf
Show()
wurde dieShow()
Funktion der abgeleiteten Klasse aufgerufen. Aber was sollen wir tun, wenn wir dieShow()
Funktion der Elternklasse aufrufen wollen ? Überprüfen Sie Programm 4 für die Lösung.Programm 4
Ausgabe:
Hier erhalten wir zwei Ausgaben, 100 und 200. Wenn die
Show()
Funktion der abgeleiteten Klasse aufgerufen wird, ruft sie zuerst dieShow()
Funktion der übergeordneten Klasse auf, daShow()
wir innerhalb der Funktion der abgeleiteten Klasse dieShow()
Funktion der übergeordneten Klasse durch Putten aufgerufen haben dassuper
Schlüsselwort vor dem Funktionsnamen.quelle
super()
ist kein Schlüsselwort. Es ist ein Konstruktoraufruf.super
ist ein Schlüsselwort, und # 1 und # 2 sind nur mit dieser Definition sinnvoll.Quellartikel: Java: Aufruf von super ()
Ja.
super(...)
ruft den Konstruktor der Superklasse auf.Illustration:
Eigenständiges Beispiel:
Drucke:
quelle
super()
, wird der Konstruktor der Superklasse aufgerufen , der keine Argumente akzeptiert. In ähnlicher Weise wird der Konstruktor mit 1 Argumenten aufgerufen, wenn Sie dies tunsuper(arg1)
, und so weiter.super()
kein gültiger Aufruf.Ja.
super()
ist eine spezielle Verwendung dessuper
Schlüsselworts, bei dem Sie einen parameterlosen übergeordneten Konstruktor aufrufen. Im Allgemeinen kann dassuper
Schlüsselwort verwendet werden, um überschriebene Methoden aufzurufen, auf versteckte Felder zuzugreifen oder den Konstruktor einer Oberklasse aufzurufen.Hier ist das offizielle Tutorial
quelle
super()
wird verwendet, um den übergeordneten Konstruktor aufzurufen,super.myMethod()
wird verwendet, um eine überschriebene Methode aufzurufen.Das Aufrufen des Super-Konstruktors ohne Argumente ist nur eine Verschwendung von Bildschirmplatz und Programmierzeit. Der Compiler generiert genau den gleichen Code, unabhängig davon, ob Sie ihn schreiben oder nicht.
quelle
Ja,
super()
(Kleinbuchstaben) ruft einen Konstruktor der übergeordneten Klasse auf. Sie können Argumente einschließen:super(foo, bar)
Es gibt auch ein
super
Schlüsselwort, das Sie in Methoden verwenden können, um eine Methode der Oberklasse aufzurufenEin schnelles Google für "Java Super" führt dazu
quelle
Das ist richtig. Super wird verwendet, um den übergeordneten Konstruktor aufzurufen. Angenommen, Sie haben einen solchen Codeblock
Anschließend können Sie der Mitgliedsvariablen n einen Wert zuweisen.
quelle
Ich habe alle Antworten gesehen. Aber alle haben vergessen, einen sehr wichtigen Punkt zu erwähnen:
super () sollte in der ersten Zeile des Konstruktors aufgerufen oder verwendet werden.
quelle
Einfach super (); Allein wird der Standardkonstruktor aufgerufen, wenn er in der Oberklasse einer Klasse vorhanden ist. Sie müssen den Standardkonstruktor jedoch explizit selbst schreiben. Wenn Sie kein Java ohne Implementierungen für Sie generieren, speichern Sie super (). Dies bezieht sich auf das universelle Superklassenobjekt und kann nicht in einer Unterklasse aufgerufen werden.
quelle
In der Selenautomatisierung haben Sie beispielsweise ein PageObject, das den Konstruktor des übergeordneten Elements wie folgt verwenden kann:
quelle
Ich möchte mit Codes teilen, was ich verstanden habe.
Das Super-Schlüsselwort in Java ist eine Referenzvariable, mit der übergeordnete Klassenobjekte referenziert werden. Es wird hauptsächlich in folgenden Zusammenhängen verwendet:
1. Verwendung von Super mit Variablen:
Ausgabe:-
Ausgabe:-
3. Verwendung von Super mit Konstruktoren:
Ausgabe:-
quelle
Konstruktoren
In einem Konstruktor können Sie ihn ohne Punkt verwenden, um einen anderen Konstruktor aufzurufen.
super
ruft einen Konstruktor in der Oberklasse auf;this
ruft einen Konstruktor in dieser Klasse auf:super
ist nützlich, wenn sich die Oberklasse selbst initialisieren muss.this
Dies ist nützlich, damit Sie den gesamten Hard-Initialisierungscode nur einmal in einen der Konstruktoren schreiben und von allen anderen, viel einfacher zu schreibenden Konstruktoren aufrufen können.Methoden
In jeder Methode können Sie sie mit einem Punkt verwenden, um eine andere Methode aufzurufen.
super.method()
ruft eine Methode in der Oberklasse auf;this.method()
ruft eine Methode in dieser Klasse auf:super
ist in einem bestimmten Szenario nützlich: Wenn Ihre Klasse dieselbe Methode wie Ihre Oberklasse hat, geht Java davon aus, dass Sie die in Ihrer Klasse haben möchten.super
Hier können Sie stattdessen nach der Methode der Oberklasse fragen.this
ist nur nützlich, um Ihren Code besser lesbar zu machen.quelle
Das Schlüsselwort super kann verwendet werden, um den Konstruktor der Oberklasse aufzurufen und auf ein Mitglied der Oberklasse zu verweisen
Wenn Sie anrufen super () mit den richtigen Argumenten, nennen wir tatsächlich den Konstruktor Box , die Variablen initialisiert Breite , Höhe und Tiefe , unter Verwendung der Werte der entsprechenden Parameter , um es bezeichnet. Sie müssen nur noch das Mehrwertgewicht initialisieren. Bei Bedarf können Sie jetzt die Variablen Box als privat klassifizieren . Tragen Sie in die Felder des privaten Modifikators der Box-Klasse ein und stellen Sie sicher, dass Sie problemlos darauf zugreifen können.
In der Oberklasse können sich mehrere überladene Versionskonstruktoren befinden, sodass Sie die Methode super () mit unterschiedlichen Parametern aufrufen können . Das Programm führt den Konstruktor aus, der den angegebenen Argumenten entspricht.
quelle
Super ist ein Schlüsselwort. Es wird innerhalb einer Unterklassenmethodendefinition verwendet, um eine in der Oberklasse definierte Methode aufzurufen. Private Methoden der Oberklasse können nicht aufgerufen werden. Nur öffentliche und geschützte Methoden können mit dem Schlüsselwort super aufgerufen werden. Es wird auch von Klassenkonstruktoren verwendet, um Konstruktoren der übergeordneten Klasse aufzurufen.
Weitere Erklärungen finden Sie hier .
quelle
Wie bereits erwähnt, befindet sich im Standardkonstruktor ein implizites super (), das in der ersten Zeile des Konstruktors aufgerufen wird .
Dieses super () ruft automatisch eine Kette von Konstruktoren auf, die am Anfang der Klassenhierarchie beginnen und sich in der Hierarchie nach unten bewegen.
Wenn die Klassenhierarchie des Programms mehr als zwei Klassen enthält , wird der Standardkonstruktor der obersten Klasse zuerst aufgerufen .
Hier ist ein Beispiel dafür:
Das obige würde ausgeben:
quelle