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,并验证了这些文件是否真的被删除了。然后我一次又一次地尝试编译。