JavaRush /Java-Blog /Random-DE /Unterschied zwischen diesem und Super-Schlüsselwörtern in...
grishin
Level 27
Харьков

Unterschied zwischen diesem und Super-Schlüsselwörtern in Java

Veröffentlicht in der Gruppe Random-DE
thisund supersind 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: thisIst superes möglich, einem Schlüsselwort in Java eine andere Bedeutung zuzuweisen this? und was ist der Unterschied zwischen Schlüsselwörtern thisund superin Java. Weiß nicht? Nun, ich gebe die Antwort hier nicht – sie finden Sie am Ende des Artikels. Unterschied zwischen diesem und Super-Schlüsselwörtern in Java – 1Wie ich eingangs sagte, besteht der Hauptunterschied zwischen thisund superin Java darin, dass thisdie aktuelle Instanz eine Klasse repräsentiert, während superdie aktuelle Instanz die übergeordnete Klasse repräsentiert. Hier ist ein Beispiel für die Verwendung von Variablen thisund 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 thisund 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 thisVerwendung sehen super. Auch in thisJava superwerden sie verwendet, um auf Variablen einer Klasseninstanz und ihrer übergeordneten Instanz zuzugreifen. Tatsächlich kann auf sie ohne die Präfixe superund 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 thiseines Konstruktors, der einen Parameter mit demselben Namen wie die Instanzvariable akzeptiert. Später in diesem Artikel werden wir herausfinden, welche weiteren Unterschiede es zwischen superund gibt this, und uns einige Beispiele für ihre Verwendung ansehen.

Wie ähnlich sind this und super?

thisBevor wir uns die Unterschiede zwischen Schlüsselwörtern und ansehen super, werfen wir einen Blick auf einige ihrer Gemeinsamkeiten:
  1. Sowohl this, als auch supersind 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 thiskann nicht aus einem statischen Kontext referenziert werden.“ Das Gleiche passiert, wenn Sie das Schlüsselwort in der Hauptmethode verwenden super.

  2. Sowohl this, als auch superkö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(""); // вызов конструктора с одним аргументом класса B
        System.out.println("Конструктор без аргументов класса B");
    }

   B(String args){
        super(""); // вызов конструктора с одним аргументом класса A
        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
  1. Innerhalb des Konstruktors thisund supermuss 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 superund thiswarum 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. thisfü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 thisund auflistensuper
  1. Eine Variable thisbezieht sich auf die aktuelle Instanz der Klasse, in der sie verwendet wird, während sie supersich auf die aktuelle Instanz der übergeordneten Klasse bezieht.

  2. 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().
thisDas ist wahrscheinlich alles, was man über die Unterschiede zwischen Schlüsselwörtern und superin 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 thiskann 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 .
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION