В этой статье я хотел бы затронуть тему внутренних и вложенных классов в 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();
}

Я надеюсь, что данная статья была полезной. В следующих статьях я хотел бы продолжить данную тему и рассказать ещё больше о внутренних и вложенных классах. Всем удачи!

Комментарии   

0 #2 Vietstep 31.03.2020 18:20
А продолжение будет?
Цитировать
+1 #1 Georgefak 31.03.2020 09:27
Благодарю, Lime's projects development за столь нужную, статью!
У вас отличный потенциал, развивайте его и создавайте больше подобных статей и постов!
С благодарностью, Ольга.
Цитировать

Добавить комментарий

Имя (обязательное)
Сайт
Защитный код
Обновить