93

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

Find$1.class 
Find$2.class
Find$3.class
Find.class

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

4

4 回答 4

121

内部类(如果您的类中存在)​​将被编译并且类文件将是ClassName$InnerClassName. 在匿名内部类的情况下,它将显示为数字。类的大小(Java 代码)不会导致生成多个类。

例如,给定这段代码:

public class TestInnerOuterClass {
    class TestInnerChild{

    }

    Serializable annoymousTest = new Serializable() {
    };
}

将生成的类将是:

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

更新:

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

检查这个关于 SO 的讨论

于 2012-07-09T03:45:09.773 回答
15

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

看到匿名类难题

于 2012-07-09T03:45:18.757 回答
12

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

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

这些案例是我对 jar 中的 .class 文件进行检查的推导。

于 2015-08-28T15:29:05.450 回答
0

回答您关于匿名课程不好的评论。他们绝对不是。考虑将动作侦听器分配给 JButton:

JButton button = new JButton(...);
button.addActionListener(new ActionListener() { ... });

或者通过“名称”属性进行不区分大小写的排序

Collections.sort( array, new Comparator<Foo>() {
    public int compare(Foo f1, Foo f2) {
        return f1.getName().toLowerCase().compareTo(f2.getName().toLowerCase());
    }
});

您还会看到很多 Runnable 和 Callable 作为匿名类完成。

于 2012-07-11T01:16:20.980 回答