Несколько файлов .class, созданных для класса?

Из любопытства, почему иногда несколько компиляторов Java.class генерируются для класса после компиляции? Например, мое приложение имеет шесть классов. Для одного класса было создано в общей сложности 10 файлов .class, начиная с MyClass # 1 до MyClass # 10.

Ответ 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 файлы генерируются.