java编译的类包含美元符号

时间:2012-07-09 03:41:08

标签: java class compilation

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

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

我注意到它在更大的课程上做到这一点。这是因为这些类变得如此之大,它会将它编译成多个类吗?我用Google搜索并查看了多个论坛,并搜索了Java文档,但没有发现任何与之相关的内容。有人可以解释一下吗?

4 个答案:

答案 0 :(得分:94)

如果您的班级中存在任何内部类,则将编译内部类,并且类文件将为ClassName$InnerClassName。对于匿名内部类,它将显示为数字。类的大小(Java代码)不会导致生成多个类。

E.g。给出这段代码:

public class TestInnerOuterClass {
    class TestInnerChild{

    }

    Serializable annoymousTest = new Serializable() {
    };
}

将生成的类将是:

  1. TestInnerOuterClass.class
  2. TestInnerOuterClass$TestInnerChild.class
  3. TestInnerOuterCasss$1.class
  4. 更新:

    使用匿名类并不是一种不好的做法,它只取决于用法。

    查看关于SO的this讨论

答案 1 :(得分:15)

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

请参阅The Anonymous Class Conundrum

答案 2 :(得分:7)

除了@mprabhat提出的上述案例外,其他案件可能是:

  1. 如果您的类包含枚举变量,则也会为其生成单独的类。生成的.class的名称为 ClassName $ Name_of_enum
  2. 如果您的班级 X 正在继承,即扩展另一个班级 Y ,则会生成一个名为 ClassName $ 1.class 或 ClassName $ 1 $ 1.class
  3. 如果您的班级 X 正在实施 Y 界面,则会生成一个名为 ClassName $ 1.class 的.class或的的ClassName $ 1 $ 1.class 即可。
  4. 这些案例是我在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都是匿名类。