为什么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传递的值为nullsomeMethod中的第5行)。