Вы можете вызвать метод напрямую, используя простое имя:
void fooBarMethod() {
otherMethod(); // compiles
}
Это потерпит неудачу, в тот момент, вы определяете другой метод с именем otherMethod()
в new FooBar()
анонимного класса.
Bar.this
не работает, потому что это анонимный класс, имя которого указано во время компиляции. Он получит такое имя, как Foo$1
. Итак, нет, у вас не может быть чего-то вроде Bar.this
.
Хорошо, я написал этот исходный файл:
class Bar { }
class FooBar { }
public class Demo {
public static void main() {
new Demo().method();
}
public void method() {
new Bar() {
void otherMethod() { System.out.println("Hello"); }
void barMethod() {
new FooBar() {
void fooBarMethod() {
otherMethod(); // not compiles
}
}.fooBarMethod();
}
}.barMethod();
}
}
Класс файлы сгенерированных будет:
Bar.class
FooBar.class
Demo.class
Demo$1.class // For `new Bar()` anonymous class
Demo$1$1.class // For `new FooBar()` anonymous class
Теперь, давайте идти прямо к байтовому коду new FooBar()
анонимного класс. Класс будет называться - Demo$1$1
. Таким образом, выполнив команду javap
, я получаю этот выход:
class Demo$1$1 extends FooBar {
final Demo$1 this$1;
Demo$1$1(Demo$1);
Code:
0: aload_0
1: aload_1
2: putfield #1 // Field this$1:LDemo$1;
5: aload_0
6: invokespecial #2 // Method FooBar."<init>":()V
9: return
void fooBarMethod();
Code:
0: aload_0
1: getfield #1 // Field this$1:LDemo$1;
4: invokevirtual #3 // Method Demo$1.otherMethod:()V
7: return
}
final
поля есть копия ссылки на new Bar()
инстанции. Таким образом, otherMethod()
вызывается по ссылке this$1
, которая является ссылкой на экземпляр анонимного внутреннего класса new Bar()
. Ну, вы пытались сделать это только, но поскольку это анонимный внутренний класс, вы не можете напрямую обратиться к ссылке this
. Но это подразумевается там.
Для более детального анализа:
Это чисто теоретический вопрос или вы собирались делать это? –
Это теоретический вопрос. :) – WonderCsabo
Прочтите [это] (http://stackoverflow.com/questions/763543/in-java-how-do-i-access-the-outer-class-when-im-not-in-the-inner- класс). –