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.
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.).
>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.
this
this
einen Wert, der eine Referenz auf das Objekt darstellt, für das die Instanzmethode aufgerufen wurde, oder auf das Objekt, das konstruiert wird. this
this
. this
(möglicherweise vorangestellt mit expliziten Typargumenten). Sie werden verwendet, um einen alternativen Konstruktor derselben Klasse aufzurufen. 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.
"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%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.
this
gibt Ihnen einen Verweis auf die tatsächliche Instanz. Es ist sehr häufig in Konstruktoren, zB:
Tags und Links java