Bei JavaRush werden Studierende bereits in den ersten Vorlesungen wortwörtlich an das Schlüsselwort herangeführt
und es stellt sich heraus, dass Sie einer Variablen
Das heißt,
Und unten ist der Programmcode mit dem Schlüsselwort
this
. Und mit der Zeit wird klar, was es bedeutet. Aber viele werden sich im Nachhinein wahrscheinlich ehrlich sagen, dass sie den Zen dieses Schlüsselworts lange Zeit nicht erkennen konnten. In diesem Artikel lüften wir den Schleier der Geheimnisse über die Verwendung von Schlüsselwörtern this
für diejenigen, die es immer noch nicht verstehen ... Willkommen! Wenn Sie Schildts Java- Referenzbuch zur Hand nehmen , lesen Sie auf Seite 171, dass ein Schlüsselwort this
erforderlich ist, damit eine Methode auf das Objekt verweisen kann, das sie aufgerufen hat. Das könnte tatsächlich das Ende sein. Aber wir brauchen Einzelheiten. In der Regel this
sollte es in zwei Fällen eingesetzt werden:
- Wenn eine Klasseninstanzvariable und eine Methoden-/Konstruktorvariable denselben Namen haben;
- Wenn Sie einen Konstruktor eines Typs (z. B. einen Standardkonstruktor oder einen parametrisierten Konstruktor) von einem anderen aufrufen müssen. Dies wird auch als expliziter Konstruktoraufruf bezeichnet.
Beispiel eins – Instanzvariable und Methodenvariable haben denselben Namen
Nehmen wir an, wir haben eine KlasseHuman
, für die das Feld „Name“ definiert ist: Erstellen wir name
einen Setter für die Variable (der Setter funktioniert recht gut und es gibt hier keinen Trick): Bitte beachten Sie, dass wir die Variable an die Methode (Setter) setName
übergeben ) String newName
. Wir haben eine neue Variable eingeführt und konnten sie (im Allgemeinen) so nennen, wie wir wollten, da sie nur innerhalb der {geschweiften Klammern} der Methode sichtbar wäre setName
. Beachten Sie, dass es im Setter eine Zeile gibt:
name = newName;
Das heißt, wir haben tatsächlich eine neue Variable eingeführt newName
und sie einer bereits in der Klasse vorhandenen Variablen zugewiesen name
. Viele Programmierer fanden es seltsam, eine Variable mit einem neuen Namen einzuführen, wenn es am Ende um dasselbe geht. Über den Namen in der Klasse Human
. Daher haben die Sprachentwickler darüber nachgedacht, die Verwendung eines Variablennamens bequemer zu gestalten. Mit anderen Worten, warum gibt es zwei Namen für eine Variable, die dasselbe bedeuten? Das heißt, ich würde gerne so etwas machen: Aber in diesem Fall entsteht ein Problem . Wir haben jetzt zwei Variablen, die den gleichen Namen haben. Einer String name
gehört zur Klasse Human
und der andere String name
zu ihrer Methode setName
. Daher weiß die Java-Maschine nicht, welche Variable Sie meinen, wenn Sie einen String in einen Setter schreiben:
name = name;
Java nimmt das nächstgelegene - name
aus der Methode setName
:
name
mit dieser Methode einfach einen Wert zuweisen. Was natürlich keinen Sinn ergibt. Daher war eine Möglichkeit erforderlich, eine Variable name
von einer Klasse Human
von einer Variablen name
von einer Methode zu unterscheiden setName
. Um dieses Problem zu lösen, wurde das Schlüsselwort eingeführt this
, das in diesem Fall darauf hinweist, dass es notwendig ist, eine Variable nicht einer Methode, sondern aufzurufen einer Klasse Human
:
this
es bezieht sich auf das aufrufende Objekt, wie am Anfang des Artikels gesagt wurde. Dadurch setName
wird der Name der Person über den Setter auf das erstellte Objekt gesetzt. Unten ist der Code ohne Verwendung des Schlüsselworts this
. Der Code erstellt ein Klassenobjekt Human
und gibt ihm einen Namen:
this
:
public class Solution{
public static void main(String[] args) {
Human human1 = new Human();
human1.setName("Volodya");
human1.print();
}
}
class Human{
String name;
public String getName() {
return name;
}
public void setName(String name){
this.name = name;
}
void print(){
System.out.println(name);
}
}
Dadurch wird this
vermieden, dass neue Variablen eingeführt werden, um dasselbe zu bezeichnen, wodurch der Code weniger mit zusätzlichen Variablen „überladen“ wird.
Beispiel zwei – Verwenden Sie dies, um einen Konstruktor explizit aufzurufen
Das Aufrufen eines Konstruktors von einem anderen aus kann nützlich sein, wenn Sie (seltsamerweise) mehrere Konstruktoren haben und den zuvor im Konstruktor angegebenen Initialisierungscode nicht in einem neuen Konstruktor umschreiben möchten. Verwirrt? Alles ist nicht so beängstigend, wie es scheint. Schauen Sie sich den Code unten an, er hat zwei KlassenkonstruktorenHuman
:
class Human{
int age;
int weight;
int height;
Human(int age, int weight){
this.age = age;
this.weight = weight;
}
Human(int age, int weight, int height){
//Sie rufen den Konstruktor mit zwei Parametern auf
this(age, weight);
//und die fehlende Variable hinzufügen
this.height = height;
}
}
Hier haben wir zunächst einen Zwei-Parameter-Konstruktor, der int age
and akzeptiert int weight
. Nehmen wir an, wir haben darin zwei Codezeilen geschrieben:
this.age = age;
this.weight = weight;
und dann beschlossen sie, einen weiteren Konstruktor mit drei Parametern hinzuzufügen, der neben Alter und Gewicht auch die Größe berücksichtigt. Im neuen Konstruktor könnten Sie Folgendes schreiben:
this.age = age;
this.weight = weight;
this.height = height;
Aber anstatt den Code zu wiederholen, den Sie bereits in diesem Konstruktor geschrieben haben, können Sie ein Schlüsselwort verwenden, um this
den Konstruktor explizit mit zwei Parametern aufzurufen:
this(age, weight);
// und die fehlende Variable hinzufügen:
this.height = height;
Sie sagen dem Konstruktor also gewissermaßen drei Parameter:
- Rufen Sie diesen Konstruktor auf, der zwei Parameter hat.
- und fügen Sie die fehlende Variable hinzu.
this
an alle Methoden außer statischen übergeben (daher this
wird es oft als impliziter Parameter bezeichnet) und kann verwendet werden, um auf das Objekt zu verweisen, das die Methode aufgerufen hat. Vor diesem Schlüsselwort braucht man keine Angst zu haben, denn This
es ist nicht gruselig.
GO TO FULL VERSION