Mam program w Javie, który wygląda tak.
public class LocalScreen {
public void onMake() {
aFuncCall(LocalScreen.this, oneString, twoString);
}
}
Co to LocalScreen.this
znaczy w aFuncCall
?
LocalScreen.this
odnosi się do this
otaczającej klasy.
Ten przykład powinien to wyjaśnić:
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();
}
}
Wynik:
An anonymous Runnable!
A LocalScreen object
Ten post został przepisany jako artykuł tutaj .
public class a { private class a { public void run() { System.out.println(a.this.toString()); } }
Przypuszczam, że to ta sama sprawa;a.this
ciągurun()
musi odnosić się do załączaniaa
„sthis
. Czy mam rację? (W ten sposób zminimalizowany kod znajduje się w.jar
plikach aplikacji OSX Kindle Previewer , po prostu próbuję zrozumieć, na co patrzę.)a.this
w naszym przykładzie nie jest zdefiniowana. Nie wiem, czy to ograniczenie jest prawdziwe dla kodu bajtowego. Może nie.Oznacza
this
instancjęLocalScreen
klasy zewnętrznej .Pisanie
this
bez kwalifikatora zwróci wystąpienie klasy wewnętrznej , w której znajduje się wywołanie.źródło
Kompilator pobiera kod i robi z nim coś takiego:
Jak widać, gdy kompilator przyjmuje klasę wewnętrzną, konwertuje ją na klasę zewnętrzną (była to decyzja projektowa podjęta DŁUGO dawno temu, aby maszyny wirtualne nie musiały być zmieniane, aby zrozumieć klasy wewnętrzne).
Kiedy tworzona jest niestatyczna klasa wewnętrzna, potrzebuje odwołania do rodzica, aby mogła wywoływać metody / zmienne dostępu klasy zewnętrznej.
To, co było w klasie wewnętrznej, nie jest właściwym typem, musisz uzyskać dostęp do klasy zewnętrznej, aby uzyskać odpowiedni typ do wywołania metody onMake.
źródło
new LocalScreen$1().run;
byćnew LocalScreen$1(this).run;
?Class.this
umożliwia dostęp do instancji klasy zewnętrznej. Zobacz poniższy przykład.Wtedy dostaniesz.
źródło
Wiem, jakie jest twoje zdezorientowanie, właśnie teraz napotykam problem, powinna mieć specjalną scenę, aby je rozróżnić.
Możesz zobaczyć różnicę między
THIS.this
ithis
w nowej TEJ operacji przez hashcode (. ##)test w konsoli scala:
THIS.this
zawsze wskazują zewnętrzną TĘ klasę, do której odwołuje się wartość x, alethis
jest poza anonimową nową operacją.źródło