В этой статье я хотел бы затронуть тему внутренних и вложенных классов в Java, ответить на некоторые вопросы. Да, не совсем правильно после первой статьи затрагивать сразу такие темы, но я попробую.
Две группы классов
Определим две группы классов, которые могут быть объявлены внутри другого класса: статические и не статические. Вложенные классы, объявленные как статические, называются вложенными статическими (static nested classes). Не статические называются внутренними (inner classes). Не статические классы имеют доступ к полям содержащего класса, даже если они объявлены как private. У статических классов обратная ситуация — они не имеют доступ к членам внешнего класса.
Цели использования вложенных классов
Выделим некоторые причины использования вложенных классов:
- Это отличный способ группировки классов, которые используются только в одном месте;
- Инкапсуляция: пусть имеется класс Outer и класс Inner. Класс Inner вложен в класс Outer. Теперь, если нам потребуется получить какое-либо приватное свойство класса Outer, мы без проблем его получим;
- Улучшение читаемости кода.
Дополню всё тем, что вложенные классы могут быть объявлены как private, public, protected, или package private.
Примеры использования вложенных и внутренних классов
Предположим у нас есть класс Outer, а внутри него вложенный класс NestedPublic и внутренний класс InnerPublic (оба класса публичные). Создадим для каждого класса свои экземпляры:
InnerPublic innerPublic = new InnerPublic();
NestedPublic nestedPublic = new NestedPublic();
В данном случае мы создали экземпляры класса внутри класса Outer. Теперь создадим экземпляры извне:
Outer outerObject = new Outer();
Outer.InnerPublic innerPublic = outerObject.new InnerPublic();
Outer.NestedPublic nestedPublic = new Outer.NestedPublic();
Видны небольшие различия. Давайте теперь предположим, что оба наших класса стали приватными. Логично было бы и переименовать их в NestedPrivate и InnerPrivate. В этом случае, для создания экземпляров требуется объявление методов:
void displayInner() {
InnerPrivate inner = new InnerPrivate();
}
static void displayNested() {
NestedPrivate nestedClass = new NestedPrivate();
}
Как и в прошлом примере, мы создали экземпляры класса внутри класса Outer. Экземпляры извне будут созданы следующим образом:
public void callInner() {
Outer outer = new Outer();
outer.displayInner();
}
public static void callNested() {
Outer.displayNested();
}
Я надеюсь, что данная статья была полезной. В следующих статьях я хотел бы продолжить данную тему и рассказать ещё больше о внутренних и вложенных классах. Всем удачи!
Комментарии
У вас отличный потенциал, развивайте его и создавайте больше подобных статей и постов!
С благодарностью, Ольга.
RSS лента комментариев этой записи