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

Возможный дубликат:
внутренний класс Java и статический вложенный класс

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

Ответы

Ответ 1

Нет, они не одинаковы: внутренний класс - non- static.

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

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

Обратитесь также к следующей диаграмме Джо Дарси:

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

alt text


Смежные вопросы

Ответ 2

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

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

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

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

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

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

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

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

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

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

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;
  }

}

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

См. Достичь лучшего кода Java с внутренними и анонимными классами