Eu tenho um programa Java parecido com este.
public class LocalScreen {
public void onMake() {
aFuncCall(LocalScreen.this, oneString, twoString);
}
}
O que LocalScreen.this
significa em aFuncCall
?
LocalScreen.this
refere-se a this
da classe envolvente.
Este exemplo deve explicar isso:
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();
}
}
Resultado:
An anonymous Runnable!
A LocalScreen object
Esta postagem foi reescrita como um artigo aqui .
public class a { private class a { public void run() { System.out.println(a.this.toString()); } }
Suponho que seja a mesma coisa; oa.this
prazorun()
deve se referir ao delimitadora
éthis
. Estou certo? (É assim que o código minificado está nos.jar
arquivos do aplicativo OSX Kindle Previewer , só estou tentando entender o que estou vendo.)a.this
em seu exemplo não está definido. Não sei se essa restrição é verdadeira para bytecode. Talvez não.Significa a
this
instância daLocalScreen
classe externa .Escrever
this
sem um qualificador retornará a instância da classe interna da qual a chamada está inserida.fonte
O compilador pega o código e faz algo assim com ele:
Como você pode ver, quando o compilador pega uma classe interna, ele a converte em uma classe externa (essa foi uma decisão de design feita MUITO tempo atrás para que as VMs não precisassem ser alteradas para entender as classes internas).
Quando uma classe interna não estática é criada, ela precisa de uma referência ao pai para que possa chamar métodos / variáveis de acesso da classe externa.
O this dentro do que era a classe interna não é o tipo adequado, você precisa obter acesso à classe externa para obter o tipo certo para chamar o método onMake.
fonte
new LocalScreen$1().run;
sernew LocalScreen$1(this).run;
?Class.this
permite o acesso à instância da classe externa. Veja o seguinte exemplo.Então você vai conseguir.
fonte
Eu sei qual é a sua confusão. Estou encontrando o problema agora mesmo, deveria haver uma cena especial para distingui-los.
Você pode ver a diferença entre
THIS.this
ethis
na nova operação THIS por hashcode (. ##)teste no console do scala:
THIS.this
sempre aponte para ESTA classe externa que é referenciada por val x, masthis
está além da nova operação anônima.fonte