首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内部类的语法糖是什么?

内部类的语法糖是什么?
EN

Stack Overflow用户
提问于 2017-10-15 17:50:53
回答 2查看 146关注 0票数 6

简单地说是来自Java

内部类只是语法糖,因此内部类的锁对封闭类没有影响(反之亦然)。

内部类的语法糖是什么?换句话说,内部类是否可以用其他更基本的构造来等效地重写?

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2017-10-15 18:02:15

内部类Inner如下所示:

代码语言:javascript
复制
package some.pkg;
class Outer {
  class Inner {}
}

在编译时会变成这样的类:

代码语言:javascript
复制
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的反编译字节码是:

代码语言:javascript
复制
  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)进行反编译,则如下所示:

代码语言:javascript
复制
  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的值调用方法(这是粗的,因为在调用该方法时可能没有初始化其他字段;但仍然允许)。

所以,我收回它:您不能手动实现相同的类;但是两者之间的区别只在一个非常罕见的用例中很重要。

票数 6
EN

Stack Overflow用户

发布于 2017-10-15 18:02:23

正如注释中所提到的,内部类只是声明一个单独的顶级类的语法糖,如果您想要创建类,则内部类与使用它们的差异类(逻辑分组类在一个地方使用的逻辑分组类)基本上是一样的。在这种情况下,您可能希望从java文档中使用它们(并添加此语法糖)的原因是:

  • 这是一种在逻辑上对只在一个地方使用的类分组的方法。
  • 它增加了封装。
  • 它可以使代码更具可读性和可维护性。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46758163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档