gpt4 book ai didi

java - 从嵌套内部类访问外部内部类

转载 作者:搜寻专家 更新时间:2023-11-01 02:26:36 27 4
gpt4 key购买 nike

我有以下代码:

public class Bar {}
public class FooBar {}

public class Foo {

public void method() {
new Bar() {

void otherMethod() { }

void barMethod() {

new FooBar() {

void fooBarMethod() {
Bar.this.otherMethod(); // not compiles
}
};
}
};
}

}

所以我有一个匿名内部类,其中有另一个匿名内部类。问题:有没有办法从内部类 FooBar 访问外部内部类 Bar 的方法?

最佳答案

您可以使用简单名称直接调用该方法:

void fooBarMethod() {
otherMethod(); // compiles
}

当您在 new FooBar() 匿名类中定义另一个名为 otherMethod() 的方法时,这将失败。

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 引用。但是,这是隐含的。


更详细的分析:

关于java - 从嵌套内部类访问外部内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21263022/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com