CodeGym /Java-Blog /Random-DE /Java dieses Schlüsselwort
Autor
Jesse Haniel
Lead Software Architect at Tribunal de Justiça da Paraíba

Java dieses Schlüsselwort

Veröffentlicht in der Gruppe Random-DE
Auf CodeGym wird den Schülern dieses Schlüsselwort buchstäblich von den ersten Lektionen an mit Java vertraut gemacht . Mit der Zeit wird seine Bedeutung klar. Doch rückblickend dürften sich viele Menschen eingestehen, dass sie das Zen dieses Stichworts lange Zeit nicht verstehen konnten. Dieser Artikel wird den Vorhang hinter den Geheimnissen des Schlüsselworts this für alle öffnen, die dies noch nicht konnten ... Ich habe Schildts Java-Referenz , dann können Sie auf Seite 171 sehen, dass es sich um das Schlüsselwort this handelt ist erforderlich, damit eine Methode auf das Objekt verweist, das sie aufgerufen hat. Damit könnten wir die Lektion beenden. Aber wir brauchen Einzelheiten. In der Regel müssen Sie dies in zwei Fällen verwenden:
  1. Wenn eine Instanzvariable und eine Methoden-/Konstruktorvariable denselben Namen haben;
  2. Wenn Sie einen bestimmten Konstruktortyp (z. B. einen Standardkonstruktor oder einen parametrisierten Konstruktor) von einem anderen Konstruktortyp aus aufrufen müssen. Dies wird auch als expliziter Konstruktoraufruf bezeichnet.
Und das ist es auch schon – es gibt nur zwei Fälle, in denen dieses furchteinflößende Schlüsselwort verwendet wird. Schauen wir uns nun diese beiden Fälle anhand von Beispielen an.

Beispiel 1: Eine Instanzvariable und eine Methodenvariable haben denselben Namen.

Angenommen, wir haben eine Human- Klasse, die ein Namensfeld definiert: Erstellen wir einen Setter für die Namensvariable (der Setter ist voll funktionsfähig – hier gibt es keinen Haken):

class Human {
    String name;


    public void setName(String newName) {
        name = newName;
    }
}
Beachten Sie, dass wir String newName an die setName- Setter-Methode übergeben. Wir haben eine neue Variable deklariert und hätten sie beliebig benennen können, da sie nur innerhalb der geschweiften Klammern ({}) sichtbar ist, die die setName- Methode einschließen. Beachten Sie, dass der Setter eine einzelne Zeile hat:

name = newName;
Hier haben wir eine neue Variable namens newName eingeführt und sie der vorhandenen Namensvariablen des Objekts zugewiesen . Viele Programmierer finden es möglicherweise seltsam, eine Variable mit einem neuen Namen einzuführen, wenn es letztendlich um dasselbe geht. Das heißt, wir sprechen über das Namensfeld in der Human- Klasse. Aus diesem Grund haben sich die Java-Entwickler eine Möglichkeit ausgedacht, bequem denselben Variablennamen zu verwenden. Mit anderen Worten, warum gibt es zwei Namen für eine Variable, die dasselbe bezeichnen? Mit anderen Worten, wir wollen so etwas machen:

class Human {
    String name;


    public void setName(String name) {
        name = name;
    }
}
Aber hier stoßen wir auf ein Problem . Wir haben jetzt zwei Variablen mit demselben Namen. Ein String-Name gehört zur Human- Klasse, während der andere String-Name zur setName- Methode gehört. Daher weiß die JVM nicht, auf welche Variable Sie sich beziehen, wenn Sie die folgende Zeile in den Setter schreiben:

name = name;
Java geht davon aus, dass Sie die nächstgelegene Namensvariable meinen , also die aus der setName- Methode: Das Schlüsselwort this (mit Beispielen) – 3Es stellt sich also heraus, dass Sie die Namensvariable der Methode einfach sich selbst zuweisen. Was natürlich keinen Sinn ergibt. Daher benötigte die Sprache eine Möglichkeit, die Namensvariable der Human- Klasse von der Namensvariablen in der setName- Methode zu unterscheiden . Dieses Problem wurde durch die Einführung des Schlüsselworts „this“ gelöst , das in diesem Fall angibt, dass Sie auf die Variable verweisen möchten, die einer Instanz der Human- Klasse zugeordnet ist, und nicht auf die Variable in der Methode: Mit anderen Worten: thisDas Schlüsselwort this (mit Beispielen) – 4bezieht sich auf das aufrufende Objekt, wie wir am Anfang des Artikels erwähnt haben. Als Ergebnis legt die Methode setName den Namen der Person auf dem erstellten Objekt fest. Unten finden Sie den Programmcode ohne Verwendung des Schlüsselworts this . Der Code erstellt ein Human- Objekt und weist ihm einen Namen zu: Das Schlüsselwort this (mit Beispielen) – 5Und hier ist der Code mit dem Schlüsselwort this :

public class Solution {
    public static void main(String[] args) {
        Human human1 = new Human();
        human1.setName("Vinny");
        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);
    }
}
Auf diese Weise können wir die Einführung neuer Variablen vermeiden, die dasselbe bezeichnen, wodurch der Code sauberer und weniger mit zusätzlichen Variablen überladen wird.

Beispiel 2: Verwendung für einen expliziten Konstruktoraufruf

Das Aufrufen eines Konstruktors von einem anderen aus kann nützlich sein, wenn Sie (seltsamerweise) mehrere Konstruktoren haben und nicht möchten, dass der neue Konstruktor den zuvor in einem anderen Konstruktor geschriebenen Initialisierungscode dupliziert. Verwirrt? Es ist nicht so beängstigend, wie es scheint. Schauen Sie sich den Code unten an. Es gibt zwei Konstruktoren für die Human- Klasse:

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) {
        // Call the constructor with two parameters
        this(age, weight);
        // and then initialize the missing variable
        this.height = height;
    }
}
Hier haben wir zunächst einen Konstruktor mit zwei Parametern bereitgestellt: int age und intweight . Angenommen, es enthält zwei Codezeilen:

this.age = age;
this.weight = weight;
Später entscheiden wir uns, einen weiteren Konstruktor mit drei Parametern hinzuzufügen und so die Größe zu den vorhandenen Alters- und Gewichtsparametern hinzuzufügen. Sie könnten den neuen Konstruktor folgendermaßen schreiben:

this.age = age;
this.weight = weight;
this.height = height;
Aber anstatt vorhandenen Code in diesem Konstruktor zu wiederholen, können Sie das Schlüsselwort this verwenden , um den Konstruktor explizit mit zwei Parametern aufzurufen:

this(age, weight);
// and then initialize the missing variable:
this.height = height;
Es ist, als ob wir dem Drei-Parameter-Konstruktor sagen würden:
  • Rufen Sie diesen anderen Konstruktor auf, der zwei Parameter hat
  • und dann eine weitere Variable hinzufügen.
Das ist alles =). Abschließend stellen wir fest, dass das Schlüsselwort this in Java nur in Methoden und Konstruktoren verwendet wird. Dieser wird jedoch implizit an alle nicht statischen Methoden übergeben (deshalb wird er oft als impliziter Parameter bezeichnet) und kann verwendet werden, um auf das Objekt zu verweisen, das die Methode aufgerufen hat. Haben Sie keine Angst vor diesem Schlüsselwort, denn es ist nicht beängstigend.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION