Ich habe ein Java-Programm, das so aussieht.
public class LocalScreen {
public void onMake() {
aFuncCall(LocalScreen.this, oneString, twoString);
}
}
Was LocalScreen.this
bedeutet in aFuncCall
?
LocalScreen.this
bezieht sich auf this
die einschließende Klasse.
Dieses Beispiel sollte es erklären:
public class LocalScreen {
public void method() {
new Runnable() {
public void run() {
// Prints "An anonymous Runnable"
System.out.println(this.toString());
// Prints "A LocalScreen object"
System.out.println(LocalScreen.this.toString());
// Won't compile! 'this' is a Runnable!
onMake(this);
// Compiles! Refers to enclosing object
onMake(LocalScreen.this);
}
public String toString() {
return "An anonymous Runnable!";
}
}.run();
}
public String toString() { return "A LocalScreen object"; }
public void onMake(LocalScreen ls) { /* ... */ }
public static void main(String[] args) {
new LocalScreen().method();
}
}
Ausgabe:
An anonymous Runnable!
A LocalScreen object
Dieser Beitrag wurde bereits als ein Artikel neu geschrieben hier .
public class a { private class a { public void run() { System.out.println(a.this.toString()); } }
Ich nehme an, dass es die gleiche Sache ist; diea.this
inrun()
an der verweisen umschließendena
‚sthis
. Habe ich recht? (So ist der minimierte Code in den.jar
Dateien der OSX Kindle Previewer-App . Ich versuche nur zu verstehen, was ich sehe.)a.this
in Ihrem Beispiel nicht definiert. Ich weiß nicht, ob diese Einschränkung für Bytecode gilt. Vielleicht nicht.Es bedeutet die
this
Instanz der äußerenLocalScreen
Klasse.Wenn Sie
this
ohne Qualifizierer schreiben, wird die Instanz der inneren Klasse zurückgegeben , in der sich der Aufruf befindet.quelle
Der Compiler nimmt den Code und macht so etwas damit:
Wie Sie sehen können, konvertiert der Compiler eine innere Klasse in eine äußere Klasse (dies war eine Entwurfsentscheidung, die vor langer Zeit getroffen wurde, sodass VMs nicht geändert werden mussten, um innere Klassen zu verstehen).
Wenn eine nicht statische innere Klasse erstellt wird, benötigt sie einen Verweis auf das übergeordnete Element, damit sie Methoden / Zugriffsvariablen der äußeren Klasse aufrufen kann.
Da dies innerhalb der inneren Klasse nicht der richtige Typ ist, müssen Sie Zugriff auf die äußere Klasse erhalten, um den richtigen Typ für den Aufruf der onMake-Methode zu erhalten.
quelle
new LocalScreen$1().run;
seinnew LocalScreen$1(this).run;
?Class.this
Ermöglicht den Zugriff auf die Instanz der äußeren Klasse. Siehe folgendes Beispiel.Dann wirst du bekommen.
quelle
Ich weiß, was Ihre Verwirrung ist. Ich bin gerade auf das Problem gestoßen, es sollte eine spezielle Szene haben, um sie zu unterscheiden.
Sie können den Unterschied zwischen
THIS.this
undthis
in der neuen DIESEN Operation anhand des Hashcodes (. ##) erkennen.Test in der Scala-Konsole:
THIS.this
Zeigen Sie immer auf die äußere DIESE Klasse, auf die durch val x verwiesen wird, die jedochthis
über eine anonyme neue Operation hinausgeht.quelle