我一直在使用 Eclipse 作为我的 IDE。我还使用它将我的应用程序导出到 JAR 文件中。当我查看 JAR 文件中的类时,我的一些类包含该类的名称、一个美元符号,然后是一个数字。例如:
Find$1.class
Find$2.class
Find$3.class
Find.class
我注意到它在更大的课程中这样做。这是因为类变得如此之大,它将它编译成多个类吗?我用谷歌搜索并查看了多个论坛,并搜索了 Java 文档,但没有找到任何与之相关的内容。有人可以解释一下吗?
我一直在使用 Eclipse 作为我的 IDE。我还使用它将我的应用程序导出到 JAR 文件中。当我查看 JAR 文件中的类时,我的一些类包含该类的名称、一个美元符号,然后是一个数字。例如:
Find$1.class
Find$2.class
Find$3.class
Find.class
我注意到它在更大的课程中这样做。这是因为类变得如此之大,它将它编译成多个类吗?我用谷歌搜索并查看了多个论坛,并搜索了 Java 文档,但没有找到任何与之相关的内容。有人可以解释一下吗?
内部类(如果您的类中存在)将被编译并且类文件将是ClassName$InnerClassName
. 在匿名内部类的情况下,它将显示为数字。类的大小(Java 代码)不会导致生成多个类。
例如,给定这段代码:
public class TestInnerOuterClass {
class TestInnerChild{
}
Serializable annoymousTest = new Serializable() {
};
}
将生成的类将是:
TestInnerOuterClass.class
TestInnerOuterClass$TestInnerChild.class
TestInnerOuterCasss$1.class
更新:
使用匿名类并不是一个坏习惯,它只取决于用法。
检查这个关于 SO 的讨论
这是因为您在这个更大的类中有匿名类。它们使用此命名约定进行编译。
看到匿名类难题
除了@mprabhat 提出的上述案例外,其他案例可能是:
这些案例是我对 jar 中的 .class 文件进行检查的推导。
回答您关于匿名课程不好的评论。他们绝对不是。考虑将动作侦听器分配给 JButton:
JButton button = new JButton(...);
button.addActionListener(new ActionListener() { ... });
或者通过“名称”属性进行不区分大小写的排序
Collections.sort( array, new Comparator<Foo>() {
public int compare(Foo f1, Foo f2) {
return f1.getName().toLowerCase().compareTo(f2.getName().toLowerCase());
}
});
您还会看到很多 Runnable 和 Callable 作为匿名类完成。