gpt4 book ai didi

java - 内部类是什么的语法糖?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:04:43 24 4
gpt4 key购买 nike

简而言之,来自 Java

Inner classes are just syntactic sugar, so locks on inner classes have no effect on the enclosing class (and vice versa).

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

谢谢。

最佳答案

一个内部类,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;
}
}

您可以手动声明这个类。

好吧,几乎就是这样。关于为 Outer 的实例提供对 Inner 成员的访问的一些细节;但大致就是这样。


哦,这很有趣。生成的代码有所不同。

如果你编译“加糖”代码,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

如果你反编译“脱糖”版本(带有 $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 的值调用方法(这很恶心,因为调用该方法时其他字段可能尚未初始化;但仍然允许这样做)。

所以,我收回:你不能完全手动实现同一个类;但两者之间的区别仅在非常罕见的用例中才重要。

关于java - 内部类是什么的语法糖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46758163/

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