Внутренний класс всегда имеет неявную ссылку на внешний класс, который отображается как «этот $ 0». Возьмем для примера этот код:
public class Test {
String test;
// inner class has a this$0 reference to its outer / parent object
public class Inner {
String inner;
void bar(Object anonymous) {
// the debugger screenshot is taken here
System.out.println();
}
}
void foo() {
// create an instance of Inner and pass an anonymous inner class to it
new Inner().bar(new Runnable() {
public void run() {}
});
}
public static void main(String[] args) {
new Test().foo();
}
}
Если вы установите точку останова в «bar», стек вызовов будет: main -> foo -> bar. Отладчик показывает следующие переменные:
введите описание изображения здесь
Bar - это метод во внутреннем классе (id 22), который указывает на внешний класс (id 24) через этот $ 0.
Также существует анонимный внутренний класс в Тест, который называется Тестом $ 1. Он также имеет тот же указатель.
Если вы определяете Inner как c внутренний класс, этот указатель отсутствует.
Просматривая ссылку «ScheduleWindow $ 1», вы, вероятно, имеете анонимный класс, определенный где-то там (например, Runnable в приведенном выше примере), и этот экземпляр имеет ссылку this $ 0 на ScheduleWindow.