Нет, это не одно и то же: внутренний класс не статический
.
JLS 8.1.3 Внутренние классы и закрывающие экземпляры
внутренний класс - это вложенный класс, который не является явно или неявно объявленным статическим.
См. Также следующую диаграмму от Джо Дарси:
Oracle Weblog Джозефа Д. Дарси - Вложенные, внутренние, членские классы и классы верхнего уровня
Разница хорошо отражена в другом ответе. Что касается их использования / актуальности, вот мое мнение:
Они удобны для простой реализации обратных вызовов без необходимости создавать новый именованный класс.
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-кода с помощью внутренних и анонимных классов