Skip to content

Latest commit

 

History

History
153 lines (108 loc) · 6.23 KB

inner-classes-java.md

File metadata and controls

153 lines (108 loc) · 6.23 KB

// TODO

В Java можно объявить класс внутри другого класса - такой вложенный класс называется nested-классом. Вложенные классы делятся на статические и нестатические.

Нестатические вложенные классы называют еще внутренними классами - inner-классами. Класс, внутри которого объявлен другой класс назовем обрамляющим или outer-классом.

Для иллюстрации вышеперечисленного:

publuc class OuterClass {
  static NestedClass {

  }

  class InnerClass {

  }
}

Понятно, что nested класссы принадлежат outer классу, в то время как inner классы принадлежат уже экземпляру объекта класса. Другими словами - nested классы -

Вложенный класс (InnerClass)

public class OuterClass { public class InnerClass{ } }

Из него видны: — все (даже private) свойства и методы OuterClassа обычные и статические. — public и protected свойства и методы родителя OuterClassа обычные и статические. То есть те, которые видны в OuterClassе.

Его видно: — согласно модификатору доступа.

Может наследовать: — обычные классы. — такие же внутренние классы в OuterClassе и его предках.

Может быть наследован: — таким же внутренним классом в OuterClassе и его наследниках.

Может имплементировать интерфейс

Может содержать: — только обычные свойства и методы (не статические).

Экземпляр этого класса создаётся так: OuterClass outerClass = new OuterClass(); OuterClass.InnerClass innerClass = outerClass.new InnerClass();

Статический вложенный класс (StaticInnerClass)

public class OuterClass { public static class StaticInnerClass{ } }

Из него (самого класса) видны: — статические свойства и методы OuterClassа (даже private). — статические свойства и методы родителя OuterClassа public и protected. То есть те, которые видны в OuterClassе.

Из его экземпляра видны: — все (даже private) свойства и методы OuterClassа обычные и статические. — public и protected свойства и методы родителя OuterClassа обычные и статические. То есть те, которые видны в OuterClassе.

Его видно: — согласно модификатору доступа.

Может наследовать: — обычные классы. — такие же статические внутренние классы в OuterClassе и его предках.

Может быть наследован: — любым классом: — вложенным — не вложенным — статическим — не статическим!

Может имплементировать интерфейс

Может содержать: — статические свойства и методы. — не статические свойства и методы.

Экземпляр этого класса создаётся так: OuterClass.StaticInnerClass staticInnerClass = new OuterClass.StaticInnerClass();

Локальный класс (LocalClass)

public class OuterClass { public void someMethod(){ class LocalClass{ } } }

Из него видны: — все (даже private) свойства и методы OuterClassа обычные и статические. — public и protected свойства и методы родителя OuterClassа обычные и статические. То есть те, которые видны в OuterClassе.

Его видно: — только в том методе где он определён.

Может наследовать: — обычные классы. — внутренние классы в OuterClassе и его предках. — такие же локальные классы определённые в том же методе.

Может быть наследован: — таким же локальным классом определённым в том же методе.

Может имплементировать интерфейс

Может содержать: — только обычные свойства и методы (не статические).

Анонимный класс (имени нет)

Локальный класс без имени. Наследует какой-то класс, или имплиментирует какой-то интерфейс.

public class OuterClass { public void someMethod(){ Callable callable = new Callable() { @Override public Object call() throws Exception { return null; } }; } }

Из него видны: — все (даже private) свойства и методы OuterClassа обычные и статические. — public и protected свойства и методы родителя OuterClassа обычные и статические. То есть те, которые видны в OuterClassе.

Его видно: — только в том методе где он определён.

Не может быть наследован

Может содержать: — только обычные свойства и методы (не статические).

На этом всё. Жду ваших комментариев: какие есть неточности и ошибки, что я не покрыл и т.п. Надеюсь, статья будет многим полезна.