Почему код 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"?
3 ответа
SomeClass$1.class представляет анонимный внутренний класс
хавай взгляд на анонимный раздел внутреннего класса здесь
Вы также получите что-то вроде 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
Лично я думаю, что это немного легче читать, чем типичный анонимный класс, особенно когда реализуется простой интерфейс или абстрактный класс, который служит только для передачи в другой локальный объект.
Построить на 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, если вы вызвали new Bar(). PrintMe, он напечатал бы "определенные" и в каталоге компиляции вы найдете Bar1.class
этот раздел в приведенном выше коде:
Foo f = new Foo() {
public void printMe() {
System.out.println("defined");
}
};
называется анонимным внутренним классом.