myClass $ 1.class排序的Java类文件有什么意义?

时间:2011-08-02 14:02:14

标签: java eclipse

我有许多用Eclipse编译的.java类,在/ bin目录下我看到我不仅有与我的Java类相对应的各种.class文件,还有一些在文件名中带有美元符号的文件

示例:我有一个名为RangeFinder的类,在/ bin中我看到一个RangeFinder.class和一个RangeFinder $ 1.class。

后者有什么意义?

(我在Ubuntu上,我正在使用Eclipse EE Indigo。)

2 个答案:

答案 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

匿名类被分配为“名称”,我相信它们在封闭类中的顺序。