您可以使用简单的名称直接调用该方法:
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
直接访问该引用。但是,那是隐含的。
更详细的分析: