简单地说是来自Java
内部类只是语法糖,因此内部类的锁对封闭类没有影响(反之亦然)。
内部类的语法糖是什么?换句话说,内部类是否可以用其他更基本的构造来等效地重写?
谢谢。
发布于 2017-10-15 18:02:15
内部类Inner如下所示:
package some.pkg;
class Outer {
class Inner {}
}在编译时会变成这样的类:
package some.pkg;
class Outer$Inner {
private final Outer this$0;
Outer$Inner(Outer this$0) {
this.this$0 = this$0;
}
}您可以手动声明这个类。
差不多就是这样了。关于向Inner成员提供对Outer实例的访问,有一些细节;但这是广义的。
哦,这很有趣。生成的代码有不同之处。
如果您编译了"sugared“代码,Outer$Inner的反编译字节码是:
some.pkg.Outer$Inner(some.pkg.Outer);
Code:
0: aload_0
1: aload_1
2: putfield #1 // Field this$0:Lsome/pkg/Outer;
5: aload_0
6: invokespecial #2 // Method java/lang/Object."<init>":()V
9: return 如果对"desugared“版本(使用$s)进行反编译,则如下所示:
some.pkg.Outer$Inner(some.pkg.Outer);
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: aload_0
5: aload_1
6: putfield #2 // Field this$0:Lsome/pkg/Outer;
9: return换句话说,在第一种情况下调用父构造函数之前,在第二种情况下,在调用父构造函数之前分配this$0字段。
我能看到的唯一不同之处是,它允许您将Outer.this作为参数传递给父构造函数(例如,super(Outer.this);或者允许父构造函数使用Outer.this的值调用方法(这是粗的,因为在调用该方法时可能没有初始化其他字段;但仍然允许)。
所以,我收回它:您不能手动实现相同的类;但是两者之间的区别只在一个非常罕见的用例中很重要。
发布于 2017-10-15 18:02:23
正如注释中所提到的,内部类只是声明一个单独的顶级类的语法糖,如果您想要创建类,则内部类与使用它们的差异类(逻辑分组类在一个地方使用的逻辑分组类)基本上是一样的。在这种情况下,您可能希望从java文档中使用它们(并添加此语法糖)的原因是:
https://stackoverflow.com/questions/46758163
复制相似问题