java编译的类包含美元符号

我一直在使用Eclipse作为我的开发IDE。 我也用它将我的应用程序导出到.jar文件中。 当我在.jar文件中查看我的类时,我的一些类包含该类的名称,一个美元符号,然后是一个数字。 例:

  • 查找$ 1.class
  • 查找$ 2.class
  • 查找$ 3.class
  • Find.class

我已经注意到它在更大的class上这样做。 这是因为类变得如此之大,它编译成多个类? 我search了多个论坛,并search了Java文档,但还没有发现任何与之相关的内容。 有人可以解释吗?

如果您的类中存在任何内部类,它们将被编译,并且类文件将是ClassName$InnerClassName ,并将匿名内部类作为数字显示,Class(Java Code)的大小不会导致生成多个类。

例如给定这段代码:

 public class TestInnerOuterClass { class TestInnerChild{ } Serializable annoymousTest = new Serializable() { }; } 

将生成的类将是:

  1. TestInnerOuterClass.class
  2. TestInnerOuterClass $ TestInnerChild.class
  3. TestInnerOuterCasss $ 1.class

更新:

使用匿名类不被认为是一个坏习惯,它只是取决于用法。

查看关于SO的讨论

这是因为你在这个大类中有匿名类。 他们使用这个命名约定进行编译。

见无名氏难题

除了@mprabhat提供的上述情况之外,其他情况可能是:

  1. 如果你的类包含一个枚举variables,那么也会为此生成一个单独的类。 生成的.class的名称将是ClassName $ Name_of_enum
  2. 如果您的类X正在inheritance,即扩展另一个类Y ,那么会生成一个名为ClassName $ 1.classClassName $ 1 $ 1.class的.class
  3. 如果你的类X正在实现一个接口Y ,那么将会有一个名为ClassName $ 1.class或者ClassName $ 1 $ 1.class的.class类

这些情况是我对jar中的.class文件的检查的派生。

要回答你的评论是匿名类错误。 他们绝对不是。 考虑这个分配一个动作监听器到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都是匿名类。