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