Страница Sun, с которой Вы связываетесь, имеет некоторые основные отличия между двумя:
вложенный класс А является членом своего класса включения. Нестатические вложенные классы (внутренние классы) имеют доступ к другим членам класса включения, даже если они объявляются частные. Статические вложенные классы не имеют доступа к другим членам класса включения.
...Примечание: статический вложенный класс взаимодействует с членами экземпляра своего внешнего класса (и других классов) точно так же, как любой другой класс верхнего уровня. В действительности, статический вложенный класс является поведенчески классом верхнего уровня, который был вложен в другом классе верхнего уровня для упаковочного удобства.
нет никакой потребности в LinkedList.Entry
, чтобы быть классом верхнего уровня, как это [только 117] используемые LinkedList
(существуют некоторые другие интерфейсы, которые также имеют статические вложенные классы, названные Entry
, такой как Map.Entry
- то же понятие). И так как этому не нужен доступ к членам LinkedList, имеет смысл для него быть статичным - это - намного более чистый подход.
Как Jon Skeet указывает , я думаю, что это - лучшая идея при использовании вложенного класса, должен начаться с ним являющийся статичным, и затем решить, должно ли это действительно быть нестатично на основе использования.
Я не знаю о различии в производительности, но как Вы говорите, статический вложенный класс не является частью экземпляра класса включения. Кажется просто более простым создать статический вложенный класс, если Вам действительно не нужен он, чтобы быть внутренним классом.
Это немного похоже, почему я всегда делаю свой финал переменных в Java - если они не являются окончательными, я знаю, что существует что-то забавное продолжение их. При использовании внутреннего класса вместо статического вложенного класса должно быть серьезное основание.
Простой пример:
package test;
public class UpperClass {
public static class StaticInnerClass {}
public class InnerClass {}
public static void main(String[] args) {
// works
StaticInnerClass stat = new StaticInnerClass();
// doesn't compile
InnerClass inner = new InnerClass();
}
}
, Если нестатичный кроме класса нельзя инстанцировать в экземпляре высшего сословия (так не в примере, где основной статическая функция)
Одна из причин помех по сравнению с нормальным имеет отношение к classloading. Вы не можете инстанцировать внутреннего класса в конструкторе, он - родитель.
пз: я всегда понимал 'вложенный' и 'внутренний', чтобы быть взаимозаменяемым. Могут быть тонкие нюансы в терминах, но большинство Java-разработчиков поняло бы также.
Существуют неочевидные проблемы удержания памяти для принятия во внимание здесь. Так как нестатический внутренний класс поддерживает неявную ссылку на, он - 'внешний' класс, если на экземпляр внутреннего класса сильно ссылаются, то на внешний экземпляр сильно ссылаются также. Это может привести к некоторому царапанию головы, когда внешний класс не собран "мусор", даже при том, что это появляется , что ничто не ссылается на него.
Ну, с одной стороны, нестатические внутренние классы имеют дополнительное, скрытое поле, которое указывает на экземпляр внешнего класса. Таким образом, если бы класс Записи не был статичен, то помимо наличия доступа, в котором это не нуждается, он нес бы приблизительно четыре указателя вместо три.
, Как правило, я сказал бы, если Вы определяете класс, это должно в основном там действовать как набор элементов данных, как "структура" в C, считать создание его статичным.
По моему мнению вопрос должен быть наоборот каждый раз, когда Вы видите, что внутренний класс - делает это действительно потребность быть внутренним классом, с дополнительной сложностью и неявным (а не явный и более ясный, IMO) ссылка на экземпляр содержания класса?
Мышление Вы, я смещаюсь как вентилятор C# - C# не имеет эквивалента внутренних классов, хотя это действительно имеет вложенные типы. Я не могу сказать, что пропустил внутренние классы все же:)