Как стать автором
Обновить

Вложенные классы в Java

Время на прочтение3 мин
Количество просмотров69K
image

Добрый день, Хабровчане! Я уже довольно давно программирую на 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е.

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

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

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

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

Публикации

Изменить настройки темы

Истории

Работа

Java разработчик
352 вакансии

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн