Java: почему внутренний класс должен быть статическим? - PullRequest
0 голосов
/ 12 апреля 2011

Я знаю, что внутренний класс должен быть статическим, потому что он будет связывать публичные и внутренние классы, и внутренний класс будет создаваться все время, когда создавались публичные классы.И мой вопрос, как это проверить?Я имею в виду написать простое приложение и сделать цикл для создания объектов и увидеть, что объекты не удаляются GC в каком-либо профилировщике. Могу ли я сделать что-то подобное, если бы кто-нибудь это сделал?Спасибо.

Ответы [ 3 ]

8 голосов
/ 12 апреля 2011

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

Если вы имеете в виду, что экземпляр внутреннего класса всегда будет создаваться при создании экземпляра внешнего класса,это не так.

Вы можете иметь внешние экземпляры без прикрепленных внутренних экземпляров, и один и тот же внешний экземпляр может иметь любое количество прикрепленных внутренних экземпляров (и разных внутренних классов тоже).

Это (в некоторой степени) скорее наоборот: когда вы создаете экземпляр (нестатического) внутреннего класса, этот экземпляр будет содержать ссылку на его внешний экземпляр (но это ссылка на уже существующий объект, а не новыйпервый: вы не можете создать внутренний экземпляр без предварительного внешнего).

3 голосов
/ 12 апреля 2011

Внутренний класс не должен быть статическим.Фактически, одно из их наиболее распространенных проявлений - анонимные внутренние классы - никогда статические.

Фраза "статический класс" не приводит к созданию класса во время выполнения - классы создаются «загрузчиком» только один раз, когда они загружаются.Вы хотели сказать, что экземпляр внутреннего класса будет создаваться каждый раз, когда создается экземпляр внешнего класса.И это тоже false в целом (см. Ответ Тило).

Не беспокойтесь - я неправильно понял внутренние классы точно так же, как вы, когда впервые узнал о них!

Нестатический внутренний класс будет иметь неявную (т.е. она там автоматически, вы не объявляете это) ссылку на экземпляр внешнего класса, который его создал.Это будет препятствовать тому, чтобы экземпляр внешнего класса был GCed, пока существует экземпляр внутреннего класса, точно так же как нормальная ссылка Java.

Статический внутренний класс не будет иметь такую ​​ссылку, потому что это несозданный внешним экземпляром, но загрузчиком классов.

3 голосов
/ 12 апреля 2011

Это можно сделать с помощью статического анализа.Если вы используете Eclipse, проверьте плагин FindBugs , он может обнаружить отсутствие внутренних классов static и кучу других полезных проблем.

...