'dies' in Java: Wie funktioniert es?

8

Ich weiß, dass "das" in Java als Referenz dient. Wir können es nur innerhalb der Klassenmitglieder verwenden.

Was ich fragen möchte, ist ... weil es in den Membern der Klasse verwendet wird, dh es muss entweder eine Instanzvariable oder ein Parameter sein.

Und nehmen wir an, wenn es sich um eine Methode handelt, die aber in Blöcken arbeitet. block enthält keine params und alle ..können Sie erklären, was es ist ... wie genau es in java definiert wurde? Wie genau es verwendet von JVM.

    
anil 05.08.2010, 09:02
quelle

7 Antworten

33

Aus linguistischer Sicht ist this weder eine lokale Variable noch ein Parameter. Syntaktisch ist es ein Schlüsselwort. Semantisch ist es eine explizite Art, "das aktuelle Objekt" zu sagen; siehe JLS 15.8.3 . Zum Beispiel:

  • this.<attributeName> verweist explizit auf ein Instanz-Level-Attribut des aktuellen Objekts.
  • <methodName>(this) ruft eine Methode auf und übergibt einen Verweis auf das aktuelle Objekt als explizites Argument.

Das Schlüsselwort this hat in Java andere Verwendungszwecke, die nicht genau "das aktuelle Objekt" bedeuten:

  • this(<optArgumentList>) als erste Anweisung in einem Konstruktor verkettet zu einem anderen Konstruktor in derselben Klasse; JLS 8.8.7 .
  • <className>.this innerhalb einer inneren Klasse bezieht sich auf die Instanz einer einschließenden Klasse für das aktuelle Objekt; JLS 15.8.4 .

Aus einer Implementierungsperspektive können Sie sich die "this" -Referenz als einen versteckten oder impliziten Parameter vorstellen, der jedes Mal, wenn eine Instanzmethode aufgerufen wird, übergeben wird. Tatsächlich ist dies mehr oder weniger die Art und Weise, wie die Objektreferenz von den "invoke *" - Bytecodes der JVM behandelt wird. Sie schieben die Zielobjektreferenz auf den "opstack", gefolgt von jedem der Argumentwerte, und führen dann die Anweisung "invoke ..." aus. (Schauen Sie hier für die Details.).

>     
Stephen C 05.08.2010 09:06
quelle
7

Instanzmethoden werden im Kontext einer tatsächlichen Instanz, eines tatsächlichen Objekts, aufgerufen.

Innerhalb der Instanzmethode von class bezieht sich this (in den meisten Fällen) auf dieses Objekt. Dies ist eine relative Referenz: Wenn dieselbe Methode für ein anderes Objekt aufgerufen wird, verweist this innerhalb der Ausführung dieser Methode jetzt auf dieses zweite Objekt.

Der Vollständigkeit halber sollte erwähnt werden, dass Java auch über das sogenannte "qualifizierte" this verfügt, mit dem nicht auf das Objekt verwiesen werden kann, auf das die Methode angewendet wird, sondern auf das umschließende Objekt eines inneren class .

Es kann auch mit einigen Einschränkungen in Konstruktoren erscheinen, einen anderen Konstruktor derselben Klasse aufzurufen. super kann auch auf diese Weise verwendet werden.

Referenzen

  • JLS 15.8.3 this
    • Bei Verwendung als primärer Ausdruck bezeichnet das Schlüsselwort this einen Wert, der eine Referenz auf das Objekt darstellt, für das die Instanzmethode aufgerufen wurde, oder auf das Objekt, das konstruiert wird.
  • JLS 15.8.4 Qualified this
    • Auf jede lexikalisch umschließende Instanz kann verwiesen werden, indem das Schlüsselwort this .
    • explizit qualifiziert wird
  • JLS 8.8.7.1 Explizite Konstruktoraufrufe
    • Alternative Konstruktoraufrufe beginnen mit dem Schlüsselwort this (möglicherweise vorangestellt mit expliziten Typargumenten). Sie werden verwendet, um einen alternativen Konstruktor derselben Klasse aufzurufen.
polygenelubricants 05.08.2010 09:08
quelle
6
  

Wie genau wurde [das] in Java definiert?

In Java wird this durch die Java-Sprachspezifikation als Keyword und ist daher kein gewöhnlicher Variablenname und hat ein spezielles Verhalten.

Das Verhalten von this ist in Abschnitt 15.8.3 definiert der Spezifikation. Zum Beispiel:

  

Bei Verwendung als primärer Ausdruck bezeichnet das Schlüsselwort einen Wert, dh eine Referenz auf das Objekt, für das die Instanzmethode aufgerufen wurde (§15.12), oder auf das zu konstruierende Objekt.

    
Mark Byers 05.08.2010 09:06
quelle
5

"this" wird implizit als Argument für jeden von Ihnen vorgenommenen nicht statischen Methodenaufruf übergeben. Man kann es sich als syntaktischen Zucker vorstellen, aber auf Maschinenebene ist es in der Tat ein zusätzlicher Parameter, der bestanden wird.

%Vor%

funktioniert so (Pseudocode):

%Vor%     
codymanix 05.08.2010 09:21
quelle
2

Eine Möglichkeit, darüber nachzudenken, ist ein impliziter Parameter für Instanzmethoden und Konstruktoren. Im Fall eines Konstruktors ist es die Aufgabe des Konstruktors, "dies" einzurichten, während im Fall von Instanzmethoden diese auf "dies" angewendet werden können.

Beachten Sie, dass Java auch einen syntaktischen Zucker enthält, mit dem Sie implizit auf Felder und Methoden von "this" verweisen können, ohne this.foo anzugeben.

    
Yuliy 05.08.2010 09:13
quelle
1

this gibt Ihnen einen Verweis auf die tatsächliche Instanz. Es ist sehr häufig in Konstruktoren, zB:

%Vor%     
Zoltan Balazs 05.08.2010 09:08
quelle
0

Sie können sich das "sich selbst" vorstellen. Es ist wie ich. [Attribut], um auf Attribute oder Methoden zuzugreifen.

    
toy 05.08.2010 12:39
quelle

Tags und Links