如何正确创建一个Java inner class?
How to create a Java inner class correctly?
我有以下 java 类:
public class Outer {
...
private class Inner {
...
}
...
}
假设我在 Outer
的非静态方法中。我调用 this.new Inner()
还是 new Outer.Inner()
有区别吗?在第二种情况下,是否保证不创建新的Outer
?
我的程序中有一个烦人的错误,它只是偶尔出现,而且很难找到或重现。所以我想知道这条线是否会产生任何问题。
它们是相同的,尽管它们都不必要地冗长。
以下 3 个版本产生完全相同的字节码:
class Outer {
private class Inner {
}
void foo() {
Inner a = this.new Inner();
Inner b = new Outer.Inner();
Inner c = new Inner(); // Recommended way to write it
}
}
字节码
0: new #7 // class Outer$Inner
3: dup
4: aload_0
5: invokespecial #9 // Method Outer$Inner."<init>":(LOuter;)V
8: astore_1
9: new #7 // class Outer$Inner
12: dup
13: aload_0
14: invokespecial #9 // Method Outer$Inner."<init>":(LOuter;)V
17: astore_2
18: new #7 // class Outer$Inner
21: dup
22: aload_0
23: invokespecial #9 // Method Outer$Inner."<init>":(LOuter;)V
26: astore_3
添加空行以提高清晰度。
我有以下 java 类:
public class Outer {
...
private class Inner {
...
}
...
}
假设我在 Outer
的非静态方法中。我调用 this.new Inner()
还是 new Outer.Inner()
有区别吗?在第二种情况下,是否保证不创建新的Outer
?
我的程序中有一个烦人的错误,它只是偶尔出现,而且很难找到或重现。所以我想知道这条线是否会产生任何问题。
它们是相同的,尽管它们都不必要地冗长。
以下 3 个版本产生完全相同的字节码:
class Outer {
private class Inner {
}
void foo() {
Inner a = this.new Inner();
Inner b = new Outer.Inner();
Inner c = new Inner(); // Recommended way to write it
}
}
字节码
0: new #7 // class Outer$Inner
3: dup
4: aload_0
5: invokespecial #9 // Method Outer$Inner."<init>":(LOuter;)V
8: astore_1
9: new #7 // class Outer$Inner
12: dup
13: aload_0
14: invokespecial #9 // Method Outer$Inner."<init>":(LOuter;)V
17: astore_2
18: new #7 // class Outer$Inner
21: dup
22: aload_0
23: invokespecial #9 // Method Outer$Inner."<init>":(LOuter;)V
26: astore_3
添加空行以提高清晰度。