Java 使用内部类编译代码时,为什么会创建奇怪的输出文件?

Java 使用内部类编译代码时,为什么会创建奇怪的输出文件?,java,inner-classes,Java,Inner Classes,我编译了这段代码,然后,TestInner$1.class出现了 我知道~~$1.class表示该文件具有“匿名类” 但是我不明白为什么这个类文件。我想知道原因 这是代码 public class TestInner { private static class Inner { } public static void main(String[] args){ new Inner(); } } 我尝试了另一个删除“private”标识符的版本,如下所

我编译了这段代码,然后,
TestInner$1.class
出现了

我知道
~~$1.class
表示该文件具有“匿名类”

但是我不明白为什么这个类文件。我想知道原因

这是代码

public class TestInner {
    private static class Inner { }

    public static void main(String[] args){
         new Inner();
    }
}
我尝试了另一个删除“private”标识符的版本,如下所示

public class TestInner {
    static class Inner { }

    public static void main(String[] args){
         new Inner();
    }
}
我曾经想象过,这段代码也会生成
TestInner$1.class
文件

但是,它没有创建该文件

此外,下面添加了构造函数的代码也没有生成
TestInner$1.class

public class TestInner {
    private static class Inner {
        Inner(){ }
    }

    public static void main(String[] args){
         new Inner();
    }
}
我不知道,有人能帮我吗

编辑

我发现了同样的问题,它解决了。谢谢你的帮助


您的示例都没有匿名内部类。它们都不会生成名为
TestInner$1.class
的文件。它们都将生成一个名为
TestInner$Inner.class
的文件

以下示例显示了一个匿名内部类,并将生成
TestInner$1.class

public class TestInner {
    public static void main(String[] args){
         new Object() {
             @Override public String toString () {
                 return "ninja";
             }
         };
    }
}
我不确定你的
测试$1.class
是从哪里来的,但我猜这是你之前做的实验遗留下来的


更新1:我可以确认,在不使用Eclipse的情况下,对于第一个示例,我得到了
TestInner$1.class
(除了
TestInner$Inner.class
——生成了3个文件),但对于最后两个示例,我没有得到,就像您看到的那样。当我发现原因时将更新。当通过Eclipse编译时,
TestInner$1.class
永远不会生成



更新2:OP在中找到了解决方案。

您的示例中没有任何匿名类。您的所有示例都应该创建一个
TestInner$Inner.class
。不应生成任何内容
TestInner$1.class
。可能是以前的实验遗留下来的。你可能想继续。我在谷歌上搜索了一下,然后得到信息“如果你使用Eclipse,这个类文件就不会被创建。”@Jason C谢谢!我也会再研究的。文件不可能是绝对遗留下来的。因为我已经删除了文件TestInner*.class,并验证了这些文件是否真的被删除了。然后我一次又一次地尝试编译。