Подтвердить что ты не робот

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

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

4b9b3361

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