// 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е.
Его видно: — только в том методе где он определён.
Не может быть наследован
Может содержать: — только обычные свойства и методы (не статические).
На этом всё. Жду ваших комментариев: какие есть неточности и ошибки, что я не покрыл и т.п. Надеюсь, статья будет многим полезна.