Из любопытства, почему иногда несколько компиляторов Java.class генерируются для класса после компиляции? Например, мое приложение имеет шесть классов. Для одного класса было создано в общей сложности 10 файлов .class, начиная с MyClass # 1 до MyClass # 10.
Несколько файлов .class, созданных для класса?
Ответ 1
Это для внутренние классы и статические вложенные классы, Номера с номерами являются анонимными внутренними классами.
Например:
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
)
Ответ 2
Вы получаете больше .class fils из одного исходного файла, если
-
класс содержит внутренние классы или статические внутренние классы. Внутренние классы могут гнездиться. Их имена
<outer class name>$<inner class name>
. -
внутренние интерфейсы, которые всегда статичны.
-
анонимные внутренние классы (которые на самом деле являются простыми внутренними классами без имени)
-
интерфейсы и классы доступа к пакетам до и после вашего основного класса. Вы можете иметь произвольное количество классов доступа к пакетам и интерфейсов в одном исходном файле Java. Обычно небольшие вспомогательные объекты, которые используются только классом, просто помещаются в один и тот же файл.
Ответ 3
Один исходный файл java может генерировать несколько файлов классов, если ваш класс содержит внутренние классы. Анонимные внутренние классы представлены вашими пронумерованными файлами классов.
Ответ 4
Каждый класс в java принадлежит файлу .java, но .java файл может содержать несколько классов. Это включает в себя внутренние и анонимные классы. Файлы .class, созданные для внутренних классов, содержат в имени '$'. Анонимные внутренние классы получают номера.
Ответ 5
Чтобы добавить к приведенным выше ответам, это еще один хороший пример сгенерированных внутренних классов на основе Comparators (каждый Компаратор скомпилирован в другом MyClass $X.class).
public class MyClass {
...
public void doSomething() {
...
Collections.sort(list, new Comparator<MyObj>() {
public int compare(MyObj o1, MyObj o2) {
...
}
});
...
}
...
}
Ответ 6
Если есть один файл X.java, и если он содержит 4 коллекции .sort() {}, то после компиляции X.class, X $1.class, X $2.класс, X $3.класс, X $4.класс будет получить сгенерированный.
В случае внутреннего класса и статического внутреннего класса более .class файлы генерируются.
Ответ 7
При компиляции генерируется более одного класса, только если ваш класс имеет внутренний класс.
относятся: Почему Java-код с внутренним классом генерирует третий файл SomeClass $1.class?