J'ai un programme Java qui ressemble à ceci.
public class LocalScreen {
public void onMake() {
aFuncCall(LocalScreen.this, oneString, twoString);
}
}
Que LocalScreen.this
signifie dans aFuncCall
?
LocalScreen.this
fait référence à this
la classe englobante.
Cet exemple devrait l'expliquer:
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();
}
}
Production:
An anonymous Runnable!
A LocalScreen object
Cet article a été réécrit sous forme d'article ici .
public class a { private class a { public void run() { System.out.println(a.this.toString()); } }
je suppose que c'est la même chose; l'a.this
intérieur derun()
doit se référer à la englobantea
« sthis
. Ai-je raison? (C'est ainsi que le code minifié est dans les.jar
fichiers de l'application OSX Kindle Previewer , j'essaie juste de comprendre ce que je regarde.)a.this
dans votre exemple n'est pas définie. Je ne sais pas si cette contrainte est vraie pour le bytecode. Peut être pas.Cela signifie l'
this
instance de laLocalScreen
classe externe .L'écriture
this
sans qualificatif retournera l'instance de la classe interne dans laquelle l'appel se trouve.la source
Le compilateur prend le code et fait quelque chose comme ça avec:
Comme vous pouvez le voir, lorsque le compilateur prend une classe interne, il la convertit en classe externe (il s'agissait d'une décision de conception prise il y a LONGTEMPS afin que les machines virtuelles n'aient pas besoin d'être modifiées pour comprendre les classes internes).
Lorsqu'une classe interne non statique est créée, elle a besoin d'une référence au parent pour pouvoir appeler des méthodes / accéder aux variables de la classe externe.
Le this à l'intérieur de ce qui était la classe interne n'est pas le type approprié, vous devez accéder à la classe externe pour obtenir le bon type pour appeler la méthode onMake.
la source
new LocalScreen$1().run;
êtrenew LocalScreen$1(this).run;
?Class.this
autorise l'accès à l'instance de la classe externe. Voir l'exemple suivant.Ensuite, vous obtiendrez.
la source
Je sais quelle est votre confusion. Je rencontre le problème tout à l'heure, il devrait avoir une scène spéciale pour les distinguer.
Vous pouvez voir la différence entre
THIS.this
etthis
dans la nouvelle opération THIS par hashcode (. ##)test dans la console scala:
THIS.this
pointez toujours vers la classe THIS externe qui est référencée par val x, mais quithis
est au-delà de la nouvelle opération anonyme.la source