Wenn ich die folgende Klasse schreibe:
%Vor%Das Programm kompiliert, aber wenn ich das Programm ausführe, druckt die Hauptmethode zwei 0 aus. Ich weiß, um zu sagen, dass ich die Instanzvariablen im Konstruktor initialisieren will, muss ich schreiben:
%Vor%Aber wenn ich es nicht schreibe, welche Variable wird dann im Konstruktor ausgewertet (oder berücksichtigt) (links und auf der Schreib-Handseite der Ausdrücke)? Ist das Argument oder die Instanzvariable? Macht es einen Unterschied?
Gibt es andere Fälle, in denen die Verwendung von this
obligatorisch ist?
Wenn Sie in Ihrem Konstruktor nicht "this.variable" schreiben und wenn Sie eine lokale Variable (einschließlich des Funktionsparameters) mit demselben Namen wie Ihre Feldvariable im Konstruktor haben, wird die lokale Variable berücksichtigt ; Die lokale Variable schattiert das Feld (auch bekannt als Klassenvariable).
Ein Ort, an dem "das" der einzige Weg ist:
%Vor% Wenn Sie in Ihrem Konstruktor nur j
angeben, wird der Compiler denken, dass Sie das Argument in beiden Fällen meinen. Also
weist dem Argument j
einfach den Wert des Arguments j
zu (was eine ziemlich sinnlose, aber dennoch gültige Anweisung ist).
Um dies zu verdeutlichen, können Sie also this.
voranstellen, um klarzustellen, dass Sie die Elementvariable mit dem gleichen Namen meinen.
Die andere Verwendung von this
ist, wenn Sie eine Referenz auf das aktuelle Objekt an eine Methode übergeben müssen, beispielsweise:
In diesem Beispiel müssen Sie auf das aktuelle Objekt als Ganzes verweisen (anstatt nur ein Mitglied des Objekts).
Wenn Sie dies nicht schreiben, ordnen Sie das Argument sich selbst zu; Die Argumentvariablen überschatten die Instanzvariablen.
Dies ist nützlich, wenn Sie das Objekt selbst zurückgeben möchten
%Vor%Das ist nützlich, denn wenn eine Klasse zum Beispiel Method1 () und Method2 () hat, die beides zurückgeben, dürfen Sie Aufrufe wie
schreiben %Vor%Auch innerhalb einer Methode kann es nützlich sein, das Objekt selbst während eines Anrufs an eine andere Funktion zu übergeben.
Ein weiterer nützlicher Ansatz (obwohl er selten verwendet wird) besteht darin, Methodenparameter endgültig zu deklarieren:
Der folgende Block wird nicht kompiliert und weist Sie sofort auf den Fehler hin:
%Vor%In Ihrem Konstruktorcode weisen Sie Variablen sich selbst zu. 'j' ist das im Argument für den Konstruktor angegebene j. Selbst wenn es die oben definierte Klassenvariable j wäre, dann sagt man immer noch "j = j" ... d. H. J wird links und rechts nicht anders ausgewertet.
%Vor%Was Sie gerade erleben, nennt sich Variable Shadowing . Werfen Sie einen Blick auf diese Übersicht für verschiedene Arten von Variablen in Java .
Im Allgemeinen: Der Java-Compiler verwendet die nächste Variable, die er für eine Zuweisung finden kann. In einer Methode wird zuerst versucht, eine lokale Variable zu finden und dann den Fokus ihrer Suche auf Klassen- und Instanzvariablen zu erweitern.
Eine Gewohnheit, die ich persönlich für gut halte (andere mögen sie nicht), ist eine Elementvariable mit m_ und Großbuchstaben für CONSTANT_VARIABLES, die ihren Wert nicht ändern. Code, bei dem Variable Shadowing absichtlich verwendet wird, ist sehr (!) Schwierig zu debuggen und zu arbeiten.
Sie weisen den Parameter in Ihrem Beispiel sich zu.
Ganz allgemein gesprochen: Wenn Sie Ihrer Variablen keinen Gültigkeitsbereich voranstellen, wird der aktuelle Gültigkeitsbereich angenommen - was in Ihrem Fall die Funktion ist. 'this.j' teilt der jre mit, die Variable j innerhalb des Objektbereichs zu verwenden - die Elementvariable des Objekts.
Genau wie Robert Grant sagte: "So" machen Sie deutlich, dass Sie sich auf eine Member-Variable anstatt auf eine lokale Variable beziehen.
Um Ihre Folgefrage dazu mit der Methode zu beantworten, anonymen Klasse :
Sie können auf die Methoden der äußeren Klasse verweisen:
MyOuterClass.this.yOuterInstanceMethod()
,MyOuterClass.myOuterInstanceMethod()
,- oder einfach
myOuterInstanceMethod()
wenn es keine Mehrdeutigkeit gibt .
Dies beantwortet Ihre Frage nicht ganz, aber wenn Sie Eclipse verwenden, kann die Einstellung "Zuweisung hat keinen Effekt" nützlich sein. Ich bin mir sicher, dass dies auch in anderen IDEs sein wird.
Vielleicht möchten Sie einen Blick auf Was ist der Vorteil von this/self
pointer obligatorisch explizit?
Obwohl die Verwendung von this
in Java nicht obligatorisch ist, wie Sie bemerkt haben, bin ich mir sicher, dass es auch etwas über das Thema this
in Java beleuchten wird.
Tags und Links java variable-assignment this