我有许多用Eclipse编译的.java类,在/ bin目录下我看到我不仅有与我的Java类相对应的各种.class文件,还有一些在文件名中带有美元符号的文件
示例:我有一个名为RangeFinder的类,在/ bin中我看到一个RangeFinder.class和一个RangeFinder $ 1.class。
后者有什么意义?
(我在Ubuntu上,我正在使用Eclipse EE Indigo。)
答案 0 :(得分:3)
这些是字节码形式的匿名内部类。编译器为它们提供了以1
开头的数字名称(在Java中不允许使用以数字开头的类名,但是在字节码中它是可能的,因此编译器会这样做以避免名称冲突,我猜)。普通(命名)内部类的名称类似于OuterType$InnerType.class
。
答案 1 :(得分:2)
每个.java源文件都可以包含多个Java类的定义。但是,每个.class文件只能包含单个类的字节码。
所以,如果你有一个如下所示的文件Foo.java:
public class Foo {
public class Inner {
…
}
public void method() {
widget.addListener(new Listener() {
public void listen() {…}
}
}
}
class Bar {
…
}
它将编译成以下文件:
Foo.class
Foo$Inner.class
Foo$1.class
Bar.class
匿名类被分配为“名称”,我相信它们在封闭类中的顺序。