出于好奇,为什么有时会在编译后为类生成多个Java .class文件?例如,我的应用程序有六个类。对于一个类,总共生成了10个.class文件,从MyClass#1开始到MyClass#10。
答案 0 :(得分:27)
适用于inner classes和static nested classes。有数字的是匿名的内部类。
例如:
class Foo {
class Bar { }
static class Baz { }
void run() {
Helper t = new Helper() {
int helpMethod() {
return 2;
}
};
}
}
这将生成类文件Foo.class
,Foo$Bar.class
,Foo$Baz.class
和Foo$1.class
(用于Helper
接口的实现)
答案 1 :(得分:5)
如果
,您可以从单个源文件中获得更多.class文件该类包含内部类或静态内部类。内部类可以嵌套。他们的名字是<outer class name>$<inner class name>
。
内部接口始终是静态的。
匿名内部类(实际上是没有名称的普通内部类)
主类之前和之后的包访问接口和类。您可以在单个Java源文件中拥有任意数量的包访问类和接口。通常只有类使用的小辅助对象才会被放入同一个文件中。
答案 2 :(得分:4)
如果您的类包含内部类,则一个java源文件可以生成多个类文件。匿名内部类由编号的类文件表示。
答案 3 :(得分:2)
java中的每个类都属于.java文件,但.java文件可以包含多个类。这包括内部和匿名类。为内部类生成的.class文件在其名称中包含“$”。匿名内部类获得数字。
答案 4 :(得分:0)
要添加上面的答案,这是基于Comparators生成的内部类的另一个很好的例子(每个Comparator都是用不同的 MyClass $ X.class 强>):
public class MyClass {
...
public void doSomething() {
...
Collections.sort(list, new Comparator<MyObj>() {
public int compare(MyObj o1, MyObj o2) {
...
}
});
...
}
...
}
答案 5 :(得分:0)
如果有一个X.java文件并且它包含4个collections.sort(){}那么在编译X.class之后,X $ 1.class,X $ 2.class,X $ 3.class,X $ 4.class将生成。
对于内部类和静态内部类,会生成更多.class文件。
答案 6 :(得分:-2)
编译时将生成多个类,仅当您的类具有内部类时才会生成。
参阅: Why does Java code with an inner class generates a third SomeClass$1.class file?