Das this
Schlüsselwort wird hauptsächlich in drei Situationen verwendet. Die erste und häufigste Methode sind Setter-Methoden zur eindeutigen Unterscheidung von Variablenreferenzen. Die zweite Möglichkeit besteht darin, die aktuelle Klasseninstanz als Argument an eine Methode eines anderen Objekts zu übergeben. Die dritte Möglichkeit besteht darin, alternative Konstruktoren innerhalb eines Konstruktors aufzurufen.
Fall 1: Verwenden this
zum Disambiguieren von Variablenreferenzen. In Java-Setter-Methoden übergeben wir normalerweise ein Argument mit demselben Namen wie die private Mitgliedsvariable, die wir festlegen möchten. Wir weisen dann das Argument x
zu this.x
. Dies macht deutlich, dass Sie der Instanzvariablen "name" den Wert des Parameters "name" zuweisen.
public class Foo
{
private String name;
public void setName(String name) {
this.name = name;
}
}
Fall 2: Verwendung this
als Argument, das an ein anderes Objekt übergeben wird.
public class Foo
{
public String useBarMethod() {
Bar theBar = new Bar();
return theBar.barMethod(this);
}
public String getName() {
return "Foo";
}
}
public class Bar
{
public void barMethod(Foo obj) {
obj.getName();
}
}
Fall 3: Verwenden von this
alternativen Konstrukteuren zu nennen. In den Kommentaren wies Trinithis korrekt auf eine andere häufige Verwendung von hin this
. Wenn Sie mehrere Konstruktoren für eine einzelne Klasse haben, können Sie this(arg0, arg1, ...)
einen anderen Konstruktor Ihrer Wahl aufrufen, sofern Sie dies in der ersten Zeile Ihres Konstruktors tun.
class Foo
{
public Foo() {
this("Some default value for bar");
//optional other lines
}
public Foo(String bar) {
// Do something with bar
}
}
Ich habe auch gesehen this
, wie betont wurde, dass auf eine Instanzvariable verwiesen wird (ohne dass eine Disambiguierung erforderlich ist), aber das ist meiner Meinung nach ein seltener Fall.
this(arg1, arg2, ...)
einen Konstruktor.this
, die ich vergessen hatte, und fügte sie meiner Antwort hinzu. Ich sehe daran nichts auszusetzen, da das Endergebnis insgesamt eine bessere Antwort ist, was genau der Zweck von SO ist. Ich versuche auch, wo immer möglich, Anerkennung zu geben, wie ich es bei Trinithis getan habe.this
wird sie nur verwendet, wenn eine Disambiguierung wirklich erforderlich ist, wie in meinem obigen Setter-Beispiel. Codierungsstile und "Best Practices" können natürlich stark variieren, je nachdem, wen Sie fragen. Im Allgemeinen empfehle ich jedoch, vernünftige Muster auszuwählen und diese einzuhalten. Konsistenz, auch nur intern innerhalb einer einzelnen Codebasis, trägt wesentlich zur Lesbarkeit und Wartbarkeit bei.Die zweite wichtige Verwendung von
this
(neben dem Verstecken mit einer lokalen Variablen, wie viele Antworten bereits sagen) ist der Zugriff auf eine äußere Instanz von einer verschachtelten nicht statischen Klasse aus:quelle
Sie müssen nur verwenden
this
- und die meisten Leute verwenden es nur -, wenn es eine überlappende lokale Variable mit demselben Namen gibt. (Setter-Methoden zum Beispiel.)Ein weiterer guter Grund für die Verwendung
this
ist natürlich, dass Intellisense in IDEs angezeigt wird :)quelle
Die einzige Notwendigkeit , das verwenden ,
this.
Qualifier ist , wenn eine andere Variable in den aktuellen Bereich Aktien den gleichen Namen , und Sie möchten die Instanz Mitglied beziehen (wie William beschreibt). Abgesehen davon gibt es keinen Unterschied im Verhalten zwischenx
undthis.x
.quelle
this.x
Ihren Code auch ein wenig klarer lesen lassen. Die Wartbarkeit / Lesbarkeit des Codes ist auch ein Faktor, den Sie berücksichtigen sollten ..."this" ist auch nützlich, wenn Sie einen Konstruktor von einem anderen aufrufen:
quelle
this
ist im Builder-Muster nützlich.quelle
Es gibt viele gute Antworten, aber es gibt noch einen sehr kleinen Grund,
this
überall zu setzen . Wenn Sie versucht haben, Ihre Quellcodes mit einem normalen Texteditor (z. B. Notizblock usw.) zu öffnen, verwenden Siethis
wird das Lesen durch viel einfacher.Stell dir das vor:
Dies ist mit jeder modernen IDE sehr klar zu lesen, aber mit einem normalen Texteditor ist dies ein Albtraum.
Sie werden Schwierigkeiten haben, herauszufinden, wo sich der
foo
Speicher befindet, bis Sie die Suchfunktion des Editors verwenden. Dann wirst dugetStringFromSomewhere()
aus dem gleichen Grund anschreien . Schließlich, nachdem Sie vergessen haben, wass
ist,bar = s
wird das Ihnen den letzten Schlag geben.Vergleichen Sie es damit:
foo
es sich um eine in der äußeren Klasse deklarierte Variable handeltHello
.getStringFromSomewhere()
es sich auch um eine Methode handelt, die in der äußeren Klasse deklariert ist.bar
zurWorld
Klasse gehört unds
eine lokale Variable ist, die in dieser Methode deklariert ist.Wenn Sie etwas entwerfen, erstellen Sie natürlich Regeln. So , während die API oder Projekt entwerfen, wenn Ihre Regeln sind „ wenn jemand öffnet alle diese Quellcodes mit einem Notizblock, sollte er oder sie ihn erschießen / sich in den Kopf,“ dann sind Sie völlig in Ordnung , nicht zu tun dies .
quelle
Sofern Sie keine überlappenden Variablennamen haben, dient dies nur der Übersichtlichkeit beim Lesen des Codes.
quelle
this
Schlüsselwort sehen, wenn es nicht erforderlich ist, ist es nur Boilerplate-Code, der das Lesen des Codes erschwert.this
macht es NICHT schwieriger, den Code lmao zu lesen.Die Antwort von @William Brendel lieferte drei verschiedene Anwendungsfälle auf nette Weise.
Anwendungsfall 1:
Die offizielle Java-Dokumentationsseite auf dieser Seite bietet dieselben Anwendungsfälle.
Es werden zwei Beispiele behandelt:
Verwenden Sie dies mit einem Feld und Verwenden Sie dies mit einem Konstruktor
Anwendungsfall 2:
Anderer Anwendungsfall, der in diesem Beitrag nicht zitiert wurde:
this
Kann zum Synchronisieren des aktuellen Objekts in einer Multithread-Anwendung verwendet werden, um kritische Abschnitte von Daten und Methoden zu schützen.Anwendungsfall 3:
Die Implementierung des Builder- Musters hängt von der Verwendung von ab
this
, um das geänderte Objekt zurückzugeben.Siehe diesen Beitrag
Builder in einer separaten Klasse halten (fließende Schnittstelle)
quelle
Google hat auf der Sun-Website eine Seite aufgeschlagen, auf der dies ein wenig diskutiert wird.
Sie haben Recht mit der Variablen;
this
kann in der Tat verwendet werden, um eine Methodenvariable von einem Klassenfeld zu unterscheiden.Ich hasse diese Konvention jedoch wirklich . Zwei verschiedene Variablen mit buchstäblich identischen Namen zu versehen, ist ein Rezept für Fehler. Ich bevorzuge etwas in der Art von:
Gleiche Ergebnisse, aber ohne die Möglichkeit eines Fehlers, auf den Sie versehentlich verweisen,
x
wenn Sie eigentlich darauf verweisenx
wollten.Wenn Sie es mit einer Methode verwenden, haben Sie Recht mit den Effekten. Sie erhalten die gleichen Ergebnisse mit oder ohne. Kannst du es benutzen? Sicher. Solltest du es benutzen? Bis zu Ihnen, aber da ich persönlich denke, dass es sinnlose Ausführlichkeit ist, die keine Klarheit schafft (es sei denn, der Code ist voll mit statischen Importanweisungen), bin ich nicht geneigt, ihn selbst zu verwenden.
quelle
Im Folgenden finden Sie die Möglichkeiten, das Schlüsselwort 'this' in Java zu verwenden:
this
Schlüsselworts zum Verweisen auf aktuelle Klasseninstanzvariablenthis()
, um den aktuellen Klassenkonstruktor aufzurufenthis
Schlüsselworts zum Zurückgeben der aktuellen Klasseninstanzthis
Stichwort als Methodenparameterhttps://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html
quelle
Wenn es zwei Variablen gibt, eine Instanzvariable und eine andere lokale Variable mit demselben Namen, verwenden wir diese. um auf das aktuell ausgeführte Objekt zu verweisen, um den Konflikt zwischen den Namen zu vermeiden.
quelle
this
ist eine Referenz auf das aktuelle Objekt. Es wird im Konstruktor verwendet, um zwischen der lokalen und der aktuellen Klassenvariablen mit demselben Namen zu unterscheiden. z.B:this
kann auch verwendet werden, um einen Konstruktor von einem anderen Konstruktor aufzurufen. z.B:quelle
Wird es einen Unterschied geben, wenn ich in einigen Methoden "x" anstelle von "this.x" verwende?
Normalerweise nicht. Aber manchmal macht es einen Unterschied:
Wenn ich nur "method ()" verwende, wird es nicht standardmäßig auf das aktuelle Objekt angewendet?
Ja. Verdeutlicht jedoch bei Bedarf,
this.method()
dass der Aufruf von diesem Objekt erfolgt.quelle
this
hat keinen Einfluss auf den resultierenden Code - es handelt sich um den Operator für die Kompilierungszeit, und der mit oder ohne Code generierte Code ist derselbe. Wann Sie es verwenden müssen, hängt vom Kontext ab. Zum Beispiel müssen Sie es verwenden, wie Sie sagten, wenn Sie eine lokale Variable haben, die die Klassenvariable beschattet, und Sie möchten auf die Klassenvariable und nicht auf die lokale Variable verweisen.edit: mit "resultierender Code ist der gleiche" meine ich natürlich, wenn eine Variable im lokalen Bereich die zur Klasse gehörende nicht verbirgt. So
Der resultierende Code beider Methoden ist der gleiche. Der Unterschied besteht darin, dass eine Methode eine lokale Variable mit demselben Namen deklariert
quelle
In Bezug auf William Brendels Beiträge und Fragen zu den Konferenzen in Bezug auf Fall 2 . Hier ist ein Beispiel:
Ich habe gesehen, dass dies verwendet wird, wenn Eltern-Kind-Beziehungen mit Objekten erstellt werden. Bitte beachten Sie jedoch, dass es der Kürze halber vereinfacht ist.
quelle
Das Schlüsselwort "This" in Java wird verwendet, um auf aktuelle Klassenobjekte zu verweisen.
Es gibt 6 Verwendungen von "diesem" Schlüsselwort in Java
ref: https://stacktraceguru.com/java/this-keyword-in-java
quelle
Um sicherzustellen, dass die Mitglieder des aktuellen Objekts verwendet werden. In Fällen, in denen die Thread-Sicherheit ein Problem darstellt, können einige Anwendungen die falschen Objektelementwerte ändern. Aus diesem Grund sollte dies auf das Element angewendet werden, damit der richtige Objektelementwert verwendet wird.
Wenn sich Ihr Objekt nicht mit der Thread-Sicherheit befasst, gibt es keinen Grund, anzugeben, welcher Wert des Objektmitglieds verwendet wird.
quelle