Ключевое слово static
для классов разрешено только для вложенных классов внутри другого класса.
Разница между нестатическими вложенными классами (также известными как внутренние классы) и статическими вложенными классами заключается в том, что объекты первых всегда имеют соответствующий «внешний» объект, в то время как объекты последних не имеют (они имеют только частные -уровневый доступ и находятся внутри пространства имен).
Вот пример:
class Outer {
static class StaticNested {}
class Inner {}
}
Теперь мы можем создавать объекты следующим образом:
Outer o = new Outer();
Outer.StaticNested sn = new Outer.StaticNested();
Outer.Inner i = o.new Inner();
o
соответствует соответствующему Внешнему объекту i
, тогда как sn
не имеет такого элемента. (Обычно вы создаете объекты внутренних классов из методов внешних объектов, там вы можете просто написать new Inner()
, и в качестве внешнего объекта он принимает this
.)
Снаружи Inner
мы не можем получить соответствующий внешний объект, но внутри него мы можем написать Outer.this
для ссылки на внешний объект. При необходимости это работает на нескольких уровнях.