Каково использование внутренних классов в Java? Являются вложенные классы и внутренние классы тем же? [дубликат]

15
задан Community 23 May 2017 в 12:02
поделиться

2 ответа

Нет, это не одно и то же: внутренний класс не статический .

JLS 8.1.3 Внутренние классы и закрывающие экземпляры

внутренний класс - это вложенный класс, который не является явно или неявно объявленным статическим.

См. Также следующую диаграмму от Джо Дарси:

Oracle Weblog Джозефа Д. Дарси - Вложенные, внутренние, членские классы и классы верхнего уровня

alt text


Связанные вопросы

11
ответ дан 1 December 2019 в 02:54
поделиться

Разница хорошо отражена в другом ответе. Что касается их использования / актуальности, вот мое мнение:

Анонимный класс: удобен для продуктивности

Они удобны для простой реализации обратных вызовов без необходимости создавать новый именованный класс.

button.addActionListener(
      new ActionListener() {
         public void actionPerformed( ActionEvent e ) {
              frame.dispose();
         }
      }
);

Они также удобны для многопоточности (например, анонимный Runnable ) и некоторых других подобных шаблонов.

Статический вложенный класс: удобен для инкапсуляции

Статические вложенные классы по сути похожи на обычные классы, за исключением того, что их имя OuterClass.StaticNestedClass , и вы можете играть с модификатором. Таким образом, он обеспечил некоторую форму инкапсуляции, которая не может быть достигнута с помощью классов верхнего уровня.

Подумайте, например, о LinkedList , для которого вы хотите, чтобы класс Node (используемый только внутри) не отображался в представлении пакета. Сделайте его статическим вложенным классом, чтобы он был полностью внутренним по отношению к LinkedList .

Внутренний класс: удобен для владения и инкапсуляции

Экземпляр внутреннего класса имеет доступ к полю своего включающего класса экземпляра ].Подумайте еще раз о связанном списке и представьте, что Узел является внутренним классом:

public class LinkedList {
  private Node root = null;

  public class Node {
    private Object obj;
    private Node next;

    ...

    public void setAsRoot() {
       root = this;
    }
  }

  public Node getRoot() {
    return root;
  }

  public void setRoot( Node node ) {
    root = node;
  }

}

Каждый экземпляр Узла , принадлежащий LinkedList , может обращаться к нему напрямую. Между списком и его узлами существует неявное отношение владения ; список владеет своими узлами. Для тех же отношений владения потребуется дополнительный код, если они будут реализованы с помощью обычных классов.

См. Улучшение Java-кода с помощью внутренних и анонимных классов

14
ответ дан 1 December 2019 в 02:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: