this
und
super
sind zwei spezielle Schlüsselwörter in Java, die die aktuelle Instanz einer Klasse bzw. ihre Oberklasse darstellen. Java-Programmierer verwechseln diese Wörter oft und zeigen wenig Bewusstsein für ihre besonderen Eigenschaften, nach denen in Java Core-Interviews oft gefragt wird. Ein paar Fragen, die mir sofort in den Sinn kommen, sind zum Beispiel:
this
Ist
super
es möglich, einem Schlüsselwort in Java eine andere Bedeutung zuzuweisen
this
? und was ist der Unterschied zwischen Schlüsselwörtern
this
und
super
in Java. Weiß nicht? Nun, ich gebe die Antwort hier nicht – sie finden Sie am Ende des Artikels.
Wie ich eingangs sagte, besteht der Hauptunterschied zwischen
this
und
super
in Java darin, dass
this
die aktuelle Instanz eine Klasse repräsentiert, während
super
die aktuelle Instanz die übergeordnete Klasse repräsentiert. Hier ist ein Beispiel für die Verwendung von Variablen
this
und
super
– Sie haben wahrscheinlich bereits Beispiele für den Aufruf von Konstruktoren einer Variable von einer anderen gesehen, den sogenannten. Beim Aufrufen von Konstruktoren in einer Kette ist dies durch die Verwendung von Schlüsselwörtern
this
und möglich
super
. Innerhalb einer Klasse wird zum Aufrufen ihres Konstruktors ohne Argumente verwendet
this()
, während
super()
es zum Aufrufen des Konstruktors ohne Argumente oder, wie er auch genannt wird, des Standardkonstruktors der übergeordneten Klasse verwendet wird. Übrigens können Sie auf diese Weise nicht nur einen Konstruktor ohne Argumente aufrufen, sondern auch jeden anderen Konstruktor, indem Sie ihm die entsprechenden Parameter übergeben. Wir werden bald ein Beispiel für diese
this
Verwendung sehen
super
. Auch in
this
Java
super
werden sie verwendet, um auf Variablen einer Klasseninstanz und ihrer übergeordneten Instanz zuzugreifen. Tatsächlich kann auf sie ohne die Präfixe
super
und zugegriffen werden
this
, allerdings nur, wenn sich solche Variablen im aktuellen Block nicht mit anderen Variablen überschneiden, d. h. Wenn es keine lokalen Variablen mit demselben Namen enthält, müssen Sie andernfalls Namen mit Präfixen verwenden, aber das spielt keine Rolle, weil in dieser Form sind sie noch besser lesbar. Ein klassisches Beispiel für diesen Ansatz ist die Verwendung
this
eines Konstruktors, der einen Parameter mit demselben Namen wie die Instanzvariable akzeptiert. Später in diesem Artikel werden wir herausfinden, welche weiteren Unterschiede es zwischen
super
und gibt
this
, und uns einige Beispiele für ihre Verwendung ansehen.
Wie ähnlich sind this und super?
this
Bevor wir uns die Unterschiede zwischen Schlüsselwörtern und ansehen
super
, werfen wir einen Blick auf einige ihrer Gemeinsamkeiten:
- Sowohl
this
, als auch super
sind nicht statische Variablen und können daher nicht in einem statischen Kontext verwendet werden, was bedeutet, dass sie nicht in der Hauptmethode verwendet werden können. Dies führt zur Kompilierungszeit zu einem Fehler: „Eine nicht statische Variable this
kann nicht aus einem statischen Kontext referenziert werden.“ Das Gleiche passiert, wenn Sie das Schlüsselwort in der Hauptmethode verwenden super
.
- Sowohl
this
, als auch super
können innerhalb von Konstruktoren verwendet werden, um andere Konstruktoren in einer Kette aufzurufen. Beispielsweise rufen this
() und super
() den Konstruktor ohne Argumente der erbenden bzw. übergeordneten Klasse auf.
Im folgenden Beispiel übergeben wir zunächst einen Aufruf von einem Konstruktor ohne Argumente der Klasse B an einen Konstruktor derselben Klasse B, der einen einzelnen Parameter vom Typ akzeptiert
String
, der wiederum
super("")
den Konstruktor mit einem Argument aus der Oberklasse aufruft.
class A{
A(){
System.out.println("Конструктор без аргументов класса A");
}
A(String args){
System.out.println("Конструктор с одним аргументом класса A");
}
}
class B extends A{
B(){
this("");
System.out.println("Конструктор без аргументов класса B");
}
B(String args){
super("");
System.out.println("Конструктор с одним аргументом класса B");
}
}
public class Test {
public static void main(String args[]) {
B b = new B();
}
}
Ausgabe: Ein-Argument-Konstruktor der Klasse A Ein-Argument-Konstruktor der Klasse B Kein-Argument-Konstruktor der Klasse B
- Innerhalb des Konstruktors
this
und super
muss ganz am Anfang über allen anderen Ausdrücken stehen, sonst gibt der Compiler eine Fehlermeldung aus. Daraus folgt, dass ein Konstruktor nicht sowohl this()
, als auch enthalten kann super()
.
Unterschiede zwischen Super und diesem
Jetzt wissen wir, wie man Schlüsselwörter verwendet
super
und
this
warum sie benötigt werden. Aber es gibt noch eine andere Möglichkeit, diese Schlüsselwörter zu verwenden, die ich nicht erwähnt habe – in inneren Klassen, wo es mit ihrer Hilfe sehr praktisch ist, mit der äußeren Notationsform auf eine äußere Klasse zu verweisen.
this
für seine aktuelle Instanz und Outer.
super
- für seine Eltern. Vergessen Sie nicht, Outer durch den Namen der äußeren Klasse zu ersetzen. Lassen Sie uns nun kurz die Hauptunterschiede zwischen Schlüsselwörtern
this
und auflisten
super
- Eine Variable
this
bezieht sich auf die aktuelle Instanz der Klasse, in der sie verwendet wird, während sie super
sich auf die aktuelle Instanz der übergeordneten Klasse bezieht.
- Sofern keine expliziten Aufrufe anderer Konstruktoren erfolgen, ruft jeder Konstruktor implizit
super()
den Konstruktor ohne Argumente seiner übergeordneten Klasse auf. Sie haben jedoch immer die Möglichkeit, jeden anderen Konstruktor explizit mit this()
, oder aufzurufen super()
.
this
Das ist wahrscheinlich alles, was man über die Unterschiede zwischen Schlüsselwörtern und
super
in Java und deren Verwendung in Programmen sagen kann . Wie wir gesehen haben, besteht ihr Hauptzweck darin, einen Konstruktor von einem anderen aufzurufen und auf Instanzvariablen zu verweisen, die in der aktuellen Klasse und ihrer übergeordneten Klasse deklariert sind. Vergessen Sie nicht, dass es sich hierbei nicht gerade um gewöhnliche Variablen handelt, und nun die Antwort auf meine Frage, die ich im ersten Absatz gestellt habe. Nein, einer Variablen
this
kann kein neuer Wert zugewiesen werden, da sie als endgültig deklariert ist. Sie können dies in der IDE versuchen. Sie erhalten dann den Kompilierungsfehler „Sie können einer Variablen keinen neuen Wert zuweisen
this
– sie wird als endgültig deklariert.“
Originalartikel hier .
GO TO FULL VERSION