![image](https://habrastorage.org/getpro/habr/post_images/b20/4de/bc1/b204debc11940b55018b1644e083d1f0.gif)
Добрый день, Хабровчане! Я уже довольно давно программирую на java, и нередко использую вложенные классы, но недавно наткнулся на статический вложенный класс и понял, что я о нем почти ничего не знаю. Поэтому я решил разобраться в этом, систематизировать свои знания, а заодно и поделиться этими знаниями с вами.
Вложенный класс (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е.
Его видно:
— только в том методе где он определён.
Не может быть наследован
Может содержать:
— только обычные свойства и методы (не статические).
На этом всё. Жду ваших комментариев: какие есть неточности и ошибки, что я не покрыл и т.п.
Надеюсь, статья будет многим полезна.