Out of curiosity, why are sometimes multiple Java .class files generated for a class after compilation? For example, my application has six classes. For one class, a total of 10 .class files has been generated, starting from MyClass#1 up to MyClass#10.
问题:
回答1:
These are for inner classes and static nested classes. The ones with numbers are anonymous inner classes.
For example:
class Foo {
class Bar { }
static class Baz { }
void run() {
Helper t = new Helper() {
int helpMethod() {
return 2;
}
};
}
}
This will produce class files Foo.class
, Foo$Bar.class
, Foo$Baz.class
and Foo$1.class
(for the implementation of the Helper
interface)
回答2:
You get more .class fils from a single source file if
the class contains inner classes or static inner classes. Inner classes can nest. Their names are
<outer class name>$<inner class name>
.inner interfaces which are always static.
anonymous inner classes (which in fact are plain inner classes without a name)
package access interfaces and classes before and after your main class. You can have an arbitrary number of package access classes and interfaces in a single Java source file. Usually small helper objects that are only used by the class are just put into the same file.
回答3:
One java source file can generate multiple class files, if your class contains inner classes. Anonymous inner classes are represented by your numbered class files.
回答4:
Every class in java belongs to a .java-file, but a .java-file can contain multiple classes. That includes inner and anonymous classes. The .class-files generated for inner classes contain a '$' in their name. Anonymous inner classes get numbers.
回答5:
To add to the answers above, this is another good example of generated inner classes based on Comparators (each Comparator is compiled in a different MyClass$X.class):
public class MyClass {
...
public void doSomething() {
...
Collections.sort(list, new Comparator<MyObj>() {
public int compare(MyObj o1, MyObj o2) {
...
}
});
...
}
...
}
回答6:
If there is one X.java file and if it contains 4 collections.sort() {} then after compilation X.class,X$1.class,X$2.class,X$3.class,X$4.class will get generated.
In case of inner class and static inner class more .class files get generated.
回答7:
More than one class will be generated on compilation, Only if your class is having inner class.
refer: Why does Java code with an inner class generates a third SomeClass$1.class file?