У меня есть программа на Java, которая выглядит так.
public class LocalScreen {
public void onMake() {
aFuncCall(LocalScreen.this, oneString, twoString);
}
}
Что LocalScreen.this
значит в aFuncCall
?
LocalScreen.this
относится к this
включающему классу.
Этот пример должен объяснить это:
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();
}
}
Вывод:
An anonymous Runnable!
A LocalScreen object
Это сообщение было переписано как статья здесь .
public class a { private class a { public void run() { System.out.println(a.this.toString()); } }
Я полагаю, что это то же самое;a.this
внутриrun()
должен относиться к ограждающимa
«Sthis
. Я прав? (Вот как миниатюрный код находится в.jar
файлах приложения OSX Kindle Previewer , я просто пытаюсь понять, на что я смотрю.)a.this
в вашем примере не определен. Я не знаю, верно ли это ограничение для байт-кода. Может быть нет.Это означает
this
экземпляр внешнегоLocalScreen
класса.Запись
this
без квалификатора вернет экземпляр внутреннего класса , внутри которого находится вызов.источник
Компилятор берет код и делает с ним примерно следующее:
Как вы можете видеть, когда компилятор принимает внутренний класс, он преобразует его во внешний класс (это было дизайнерское решение, принятое ДЛИННО назад, поэтому не нужно было менять виртуальные машины для понимания внутренних классов).
Когда создается нестатический внутренний класс, ему нужна ссылка на родительский объект, чтобы он мог вызывать методы / переменные доступа внешнего класса.
Это внутри того, что было внутренним классом, не является правильным типом, вам нужно получить доступ к внешнему классу, чтобы получить правильный тип для вызова метода onMake.
источник
new LocalScreen$1().run;
бытьnew LocalScreen$1(this).run;
?Class.this
разрешает доступ к экземпляру внешнего класса. См. Следующий пример.Тогда получите.
источник
Я знаю, в чем ваше замешательство. Я столкнулся с проблемой только сейчас, у нее должна быть специальная сцена, чтобы их различать.
Вы можете увидеть разницу между
THIS.this
иthis
в новой ЭТОЙ операции по хэш-коду (. ##)тест в консоли scala:
THIS.this
всегда указывают на внешний ЭТОЙ класс, на который ссылается val x, ноthis
не на анонимную новую операцию.источник