出于好奇,为什么有时会在编译后为一个类生成多个 Java .class 文件?例如,我的应用程序有六个类。对于一个类,总共生成了 10 个 .class 文件,从 MyClass#1 到 MyClass#10。
7 回答
如果您从单个源文件中获得更多 .class 文件
该类包含内部类或静态内部类。内部类可以嵌套。他们的名字是
<outer class name>$<inner class name>
。内部接口总是静态的。
匿名内部类(实际上是没有名称的普通内部类)
在主类之前和之后打包访问接口和类。您可以在单个 Java 源文件中拥有任意数量的包访问类和接口。通常只被类使用的小助手对象只是放在同一个文件中。
如果您的类包含内部类,则一个 java 源文件可以生成多个类文件。匿名内部类由您编号的类文件表示。
java 中的每个类都属于一个 .java 文件,但一个 .java 文件可以包含多个类。这包括内部和匿名类。为内部类生成的 .class 文件在其名称中包含一个“$”。匿名内部类获取数字。
为了补充上面的答案,这是基于 Comparator 生成的内部类的另一个很好的示例(每个 Comparator 都在不同的MyClass$X.class中编译):
public class MyClass {
...
public void doSomething() {
...
Collections.sort(list, new Comparator<MyObj>() {
public int compare(MyObj o1, MyObj o2) {
...
}
});
...
}
...
}
如果有一个 X.java 文件并且它包含 4 个 collections.sort() {} 则编译后会生成 X.class,X$1.class,X$2.class,X$3.class,X$4.class。
在内部类和静态内部类的情况下,会生成更多 .class 文件。
编译时会生成多个类,仅当您的类具有内部类时。