Die Verwendung von "this" in Java

7

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?

    
user42155 05.02.2009, 15:13
quelle

13 Antworten

30

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%     
Srikanth 05.02.2009 15:17
quelle
10

Wenn Sie in Ihrem Konstruktor nur j angeben, wird der Compiler denken, dass Sie das Argument in beiden Fällen meinen. Also

%Vor%

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:

%Vor%

In diesem Beispiel müssen Sie auf das aktuelle Objekt als Ganzes verweisen (anstatt nur ein Mitglied des Objekts).

    
Joachim Sauer 05.02.2009 15:18
quelle
6

Wenn Sie dies nicht schreiben, ordnen Sie das Argument sich selbst zu; Die Argumentvariablen überschatten die Instanzvariablen.

    
Robert Grant 05.02.2009 15:16
quelle
5

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.

    
Emiliano 05.02.2009 15:17
quelle
5

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%     
Mark Renouf 05.02.2009 15:30
quelle
3

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%     
Philip Reynolds 05.02.2009 15:17
quelle
3

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.

    
Thorsten79 05.02.2009 15:21
quelle
2

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.

    
soulmerge 05.02.2009 15:18
quelle
1

Genau wie Robert Grant sagte: "So" machen Sie deutlich, dass Sie sich auf eine Member-Variable anstatt auf eine lokale Variable beziehen.

    
willcodejavaforfood 05.02.2009 15:19
quelle
1

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 .
  •   
    
VonC 06.02.2009 07:01
quelle
0

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.

    
Miserable Variable 06.02.2009 07:29
quelle
0

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.

    
Piotr Dobrogost 03.07.2009 11:02
quelle
0

Um dies zu vermeiden, verwenden Sie eine IDE (wie Eclipse) und es wird in diesem Fall Warnungen generiert.

Machen Sie Ihre Felder auch endgültig, es sei denn, sie können es nicht sein. Es gibt eine Reihe von Gründen (abgesehen von diesem), dies zu tun.

    
Neil 03.07.2009 12:14
quelle

Tags und Links