为什么javac会创建一个额外的类?
我编译了以下代码(为简洁起见,省略了方法和变量):
// Outer.java public class Outer { private class Inner { } void someMethod() { Inner inObj = this.new Inner(); } public static void main(String s[]) { Outer outerObj = new Outer(); } }
当我列出创建的类时,它显示以下内容:
Outer$1.class Outer$Inner.class Outer.class
外部和外部$ Inner看似合乎逻辑。 外部1美元课程的目的是什么? 在时间尺度上创建这些的顺序是什么?
好奇。 我不确定这是为了什么。 但是如果您对类进行反编译,则可以看到它的使用方式:
public class Outer { public Outer(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."":()V 4: return void someMethod(); Code: 0: new #2 // class Outer$Inner 3: dup 4: aload_0 5: aconst_null 6: invokespecial #3 // Method Outer$Inner." ":(LOuter;LOuter$1;)V 9: astore_1 10: return public static void main(java.lang.String[]); Code: 0: new #4 // class Outer 3: dup 4: invokespecial #5 // Method " ":()V 7: astore_1 8: return } class Outer$Inner { final Outer this$0; Outer$Inner(Outer, Outer$1); Code: 0: aload_0 1: aload_1 2: invokespecial #1 // Method " ":(LOuter;)V 5: return } class Outer$1 { }
所以, Outer$1
似乎什么都没有 – 甚至不是默认的构造函数。 但是对Outer$1
的引用必须传递给Outer$Inner
来构造它。 神秘的是, someMethod
传递的值为null
( someMethod
中的第5行)。