Почему код Java с внутренним классом генерирует третий файл SomeClass $ 1.class? - PullRequest
18 голосов
/ 19 декабря 2008

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

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 ]

22 голосов
/ 19 декабря 2008

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

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

9 голосов
/ 16 апреля 2010

Вы также получите что-то вроде 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 голосов
/ 19 декабря 2008

для построения на 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");
        }
    };

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...