this

this ist ein Objekt von sich selbst und repräsentiert das Objekt selbst. Es kann verstanden werden als:Ein Zeiger auf das Objekt selbst。

Die Verwendung von this in Java lässt sich grob in 3 Arten unterteilen:

1. Gewöhnliche direkte Referenz

Darauf muss nicht näher eingegangen werden; this entspricht dem Verweisen auf das aktuelle Objekt selbst.

2. Wenn formale Parameter denselben Namen wie Member haben, verwenden Sie this zur Unterscheidung:

Beispiel

class Person { private int age = 10; public Person(){ System.out.println("Alter initialisieren:"+age); } public int GetAge(int age){ this.age = age; return this.age; } } public class test1 { public static void main(String[] args) { Person Harry = new Person(); System.out.println("Harrys Alter ist "+Harry.GetAge(12)); } }

Ausgabe:

初始化年龄:10
Harry's age is 12

Man erkennt, dass age hier der formale Parameter der GetAge-Mitgliedsmethode ist und this.age die Mitgliedsvariable der Person-Klasse ist.

3. Verweis auf Konstruktoren

Dies wird zusammen mit super besprochen, siehe unten.


super

super kann als Zeiger auf das Objekt seiner Superklasse (Elternklasse) verstanden werden, und diese Superklasse bezieht sich auf die nächstgelegene Elternklasse.

super hat außerdem drei Verwendungsweisen:

1. Gewöhnliche direkte Referenz

Ähnlich wie this ist super gleichbedeutend mit dem Verweis auf die Elternklasse des aktuellen Objekts, daher können Siesuper.xxxverwenden, um auf Mitglieder der Elternklasse zu verweisen.

2. Wenn Mitgliedsvariablen oder Methoden in der Unterklasse denselben Namen wie die in der Elternklasse haben

Beispiel

class Country { String name; void value() { name = "China"; } } class City extends Country { String name; void value() { name = "Shanghai"; super.value(); //Methode der Elternklasse aufrufen System.out.println(name); System.out.println(super.name); } public static void main(String[] args) { City c=new City(); c.value(); } }

Ausgabe:

Shanghai
China

Es ist zu sehen, dass hier sowohl die Methode der Elternklasse als auch die Variable der Elternklasse aufgerufen werden. Wenn die Methode value() der Elternklasse nicht aufgerufen wird und nur die Variable name der Elternklasse verwendet wird, dann hat der Wert der Variable name der Elternklasse den Standardwert null.

3. Verweis auf Konstruktoren

  • super(parameters): Ruft einen Konstruktor in der Elternklasse auf (sollte die erste Anweisung im Konstruktor sein).
  • this(parameters): Ruft eine andere Form des Konstruktors in dieser Klasse auf (sollte die erste Anweisung im Konstruktor sein).

Beispiel

class Person { public static void prt(String s) { System.out.println(s); } Person() { prt("Elternklasse - Konstruktor ohne Argumente:"+"Eine Person."); }//Konstruktor (1) Person(String name) { prt("Elternklasse - Konstruktor mit einem Parameter:"+"Der Name einer Person ist " + name); }//Konstruktor (2) } public class Chinese extends Person { Chinese() { super(); //Ruft den Konstruktor der Elternklasse auf (1) prt("Unterklasse - ruft den „parameterlosen Konstruktor“ der Elternklasse auf:"+"Ein chinesischer Programmierer."); } Chinese(String name) { super(name);//Rufe den Konstruktor der Elternklasse mit denselben formalen Parametern auf (2) prt("Unterklasse - ruft den „Konstruktor mit einem Parameter“ der Elternklasse auf:"+"sein Name ist " + name); } Chinese(String name, int age) { this(name);//Rufe den Konstruktor mit denselben formalen Parametern auf (3) prt("Unterklasse: ruft einen Konstruktor der Unterklasse mit denselben formalen Parametern auf: sein Alter ist" + age); } public static void main(String[] args) { Chinese cn = new Chinese(); cn = new Chinese("codersai"); cn = new Chinese("codersai", 18); } }

Ausgabe:

父类·无参数构造方法: A Person.
子类·调用父类”无参数构造方法“: A chinese coder.
父类·含一个参数的构造方法: A person's name is codersai
子类·调用父类”含一个参数的构造方法“: his name is codersai
父类·含一个参数的构造方法: A person's name is codersai
子类·调用父类”含一个参数的构造方法“: his name is codersai
子类:调用子类具有相同形参的构造方法:his age is 18

Aus diesem Beispiel können wir ersehen, dass super und this verwendet werden können, um den Konstruktor der Elternklasse bzw. andere Formen von Konstruktoren in dieser Klasse aufzurufen.

Im Beispiel ruft der dritte Konstruktor der Klasse Chinese den zweiten Konstruktor dieser Klasse auf, und der zweite Konstruktor ruft die Elternklasse auf. Daher muss zuerst der Konstruktor der Elternklasse aufgerufen werden, dann der zweite Konstruktor dieser Klasse, und schließlich wird der dritte Konstruktor umgeschrieben.


Gemeinsamkeiten und Unterschiede zwischen super und this

  • super(parameters): Ruft einen Konstruktor in der Basisklasse auf (sollte die erste Anweisung im Konstruktor sein)
  • this(parameters): Ruft eine andere Konstruktorform in dieser Klasse auf (sollte die erste Anweisung im Konstruktor sein)
  • super: Es referenziert Member in der direkten Elternklasse des aktuellen Objekts (wird verwendet, um auf Memberdaten oder Funktionen der Elternklasse zuzugreifen, die in der direkten Elternklasse verdeckt sind. Wenn die Basisklasse und die abgeleitete Klasse dieselben Memberdefinitionen haben, z. B. super.variableName super.memberFunctionName(actual parameters)). this: Es repräsentiert den Namen des aktuellen Objekts (wo im Programm leicht Mehrdeutigkeit auftreten kann, verwenden Sie this, um das aktuelle Objekt anzugeben; wenn die formalen Parameter der Funktion denselben Namen wie die Memberdaten in der Klasse haben, verwenden Sie this, um den Namen der Membervariable anzugeben).
  • Der Aufruf von super() muss als erste Zeile des Konstruktors der Unterklasse geschrieben werden, sonst schlägt die Kompilierung fehl. Die erste Anweisung jedes Konstruktors der Unterklasse ruft implizit super() auf. Wenn die Elternklasse keinen Konstruktor dieser Form hat, wird während der Kompilierung ein Fehler gemeldet.
  • super() und this() sind ähnlich. Der Unterschied besteht darin, dass super() den Konstruktor der Elternklasse aus der Unterklasse aufruft, während this() andere Methoden innerhalb derselben Klasse aufruft.
  • Sowohl super() als auch this() müssen als erste Zeile im Konstruktor stehen.
  • Obwohl this verwendet werden kann, um einen Konstruktor aufzurufen, kann es nicht zwei aufrufen.
  • this und super können nicht gleichzeitig in einem Konstruktor auftreten, weil this unweigerlich einen anderen Konstruktor aufruft und dieser andere Konstruktor unweigerlich eine super-Anweisung enthält. Daher verliert dieselbe Anweisung im selben Konstruktor ihre Bedeutung, und der Compiler wird sie nicht akzeptieren.
  • Sowohl this() als auch super() beziehen sich auf Objekte, daher können sie nicht in einer statischen Umgebung verwendet werden. Einschließlich: statische Variablen, statische Methoden, statische Anweisungsblöcke.
  • Im Wesentlichen ist this ein Zeiger auf dieses Objekt, während super ein Java-Schlüsselwort ist.

Original-Link: https://www.cnblogs.com/hasse/p/5023392.html