Каждый нестатический внутренний класс поддерживает невидимый ивар, который содержит ссылку на внешний класс, для которого он был создан.Вот что такое this$0
.
Измените InnerClass на public static class
и посмотрите на разницу.
Для ясности, Oracle рекомендует следующую терминологию:
http://download.oracle.com/javase/tutorial/java/javaOO/nested.html
Терминология: вложенные классы делятся на две категории: статические и нестатические. Вложенные классы, которые объявлены статическими , просто называются статическими вложенными классами . Нестатические вложенные классы называются внутренними классами .
...
Экземпляр InnerClass может существовать только в экземпляре OuterClass иимеет прямой доступ к методам и полям окружающего его экземпляра....
Чтобы создать экземпляр внутреннего класса, вы должны сначала создать экземпляр внешнего класса.Затем создайте внутренний объект во внешнем объекте с этим синтаксисом:
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
===
Есть ли тогда доступ к переменной $ 0 изнутривнутренний класс, если хотите?
В методе внутреннего класса вы можете сказать:
OuterClass outer = OuterClass.this;
или
System.out.println(OuterClass.this.toString());
Это особый вариантиз this - OuterClass.this
- обращается к this$0
ivar - он вернет экземпляр OuterClass
.Обратите внимание, что это отличается от использования обычного this
внутри метода InnerClass
, который будет возвращать текущий экземпляр InnerClass
.
===
Кроме того, какя могу определить, обрабатываю ли я поле "this $ 0" без сравнения строк?
Мне неясно, что вы пытаетесь сделать, поэтому я не могу порекомендовать, как добиться того, что выхочу.