Tengo un programa Java que se parece a esto.
public class LocalScreen {
public void onMake() {
aFuncCall(LocalScreen.this, oneString, twoString);
}
}
¿Qué LocalScreen.this
significa en aFuncCall
?
LocalScreen.this
se refiere a this
la clase adjunta.
Este ejemplo debería explicarlo:
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();
}
}
Salida:
An anonymous Runnable!
A LocalScreen object
Esta publicación ha sido reescrita como un artículo aquí .
public class a { private class a { public void run() { System.out.println(a.this.toString()); } }
supongo que es el mismo asunto; ela.this
plazorun()
hay que referirse a la envolventea
'sthis
. Estoy en lo cierto? (Así es como está el código minimizado en los.jar
archivos de la aplicación OSX Kindle Previewer , solo estoy tratando de entender lo que estoy viendo).a.this
en su ejemplo no está definida. No sé si esta restricción es cierta para el código de bytes. Tal vez no.Significa la
this
instancia de laLocalScreen
clase externa .Escribir
this
sin un calificador devolverá la instancia de la clase interna en la que se encuentra la llamada.fuente
El compilador toma el código y hace algo como esto con él:
Como puede ver, cuando el compilador toma una clase interna, la convierte en una clase externa (esta fue una decisión de diseño tomada hace MUCHO tiempo, por lo que las máquinas virtuales no necesitaban cambiarse para comprender las clases internas).
Cuando se crea una clase interna no estática, necesita una referencia al padre para que pueda llamar a métodos / variables de acceso de la clase externa.
El this dentro de lo que era la clase interna no es el tipo adecuado, necesita obtener acceso a la clase externa para obtener el tipo correcto para llamar al método onMake.
fuente
new LocalScreen$1().run;
sernew LocalScreen$1(this).run;
?Class.this
permite el acceso a la instancia de la clase externa. Vea el siguiente ejemplo.Entonces obtendrás.
fuente
Sé cuál es tu confusión. Me encuentro con el problema en este momento, debería tener una escena especial para distinguirlos.
Puede ver la diferencia entre
THIS.this
ythis
en la nueva operación ESTA por código hash (. ##)prueba en la consola scala:
THIS.this
siempre apunte a la clase ESTE externa que se refiere mediante val x, perothis
está más allá de una nueva operación anónima.fuente