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

Почему Java-код с внутренним классом генерирует третий файл SomeClass $1.class?

Если у меня есть внутренний класс, например:

public class Test
{
    public class Inner
    {
        // code ...
    }

    public static void main(String[] args)
    {
        // code ...
    }
}

Когда я его компилирую, я ожидаю, что он должен сгенерировать два файла:

Test.class
Test$Inner.class

Итак, почему я иногда вижу классные файлы, такие как SomeClass $1.class, хотя SomeClass не содержит внутренний класс с именем "1"?

4b9b3361

Ответ 1

Класс SomeClass $1. представляет собой анонимный внутренний класс

hava посмотрите на анонимный внутренний класс здесь

Ответ 2

Вы также получите что-то вроде SomeClass$1.class, если ваш класс содержит закрытый внутренний класс (не анонимный), но вы создаете его в какой-то момент родительского класса.

Например:

public class Person {

    private class Brain{
        void ponderLife() {
            System.out.println("The meaning of life is...");
        }
    }

    Person() {
        Brain b = new Brain();
        b.ponderLife();
    }
}

Это даст:

Person.class
Person$Brain.class
Person$1.class

Лично мне кажется, что немного легче читать, чем обычный анонимный класс, особенно при реализации простого интерфейса или абстрактного класса, который только служит для передачи в другой локальный объект.

Ответ 3

для создания на hhafez: SomeClass $1.class представляет анонимные внутренние классы. Примером такого класса будет

public class Foo{
  public void printMe(){
    System.out.println("redefine me!");
  }
}


public class Bar {
    public void printMe() {
    Foo f = new Foo() {
        public void printMe() {
        System.out.println("defined");
        }
    };
    f.printMe();
    }
}

От нормального Main, если вы вызвали новый Bar(). printMe напечатал "определенный", а в каталоге компиляции вы найдете Bar1.class

этот раздел в приведенном выше коде:

    Foo f = new Foo() {
        public void printMe() {
        System.out.println("defined");
        }
    };

называется анонимным внутренним классом.