Виды классов и типовых объявлений

Эта страница — карта, а не взаимоисключающая классификация: один класс может одновременно быть, например, top-level, abstract и sealed.

По месту объявления

ВидОсобенность
top-levelобъявлен в файле/пакете; не бывает static или private
static nestedвложен в класс, не хранит ссылку на внешний объект
innerнестатический член, связан с экземпляром внешнего класса
localобъявлен внутри блока или метода
anonymousобъявлен выражением создания объекта

Подробнее: Вложенные классы, Анонимные классы.

По роли

  • обычный concrete class — можно создать экземпляр;
  • abstract class — может содержать состояние и незавершённое поведение;
  • final class — закрыт для наследования;
  • sealed class — явно ограничивает разрешённые подтипы;
  • record — компактный носитель данных с компонентами и value-семантикой;
  • enum — закрытый набор именованных экземпляров.

Интерфейс и аннотация тоже являются типами JVM, но синтаксически объявляются interface и @interface.

sealed interface Result permits Success, Failure {}
record Success(String value) implements Result {}
record Failure(String message) implements Result {}

Ограничения

  • в одном source-файле только один public top-level тип, и имя файла совпадает с ним;
  • top-level тип имеет только public или package-private доступ;
  • inner-объект требует внешний экземпляр;
  • abstract несовместим с final;
  • sealed-иерархия требует явно указанных final, sealed или non-sealed прямых наследников.

На собеседовании

Может ли top-level класс быть static? Нет.

Чем inner отличается от static nested? Inner хранит связь с внешним экземпляром.

Можно ли создать экземпляр abstract class? Напрямую нет, но его конструктор участвует в создании наследника.

Что даёт sealed-тип? Контролируемый закрытый набор прямых подтипов.

Связано: Классы Java, Сравнение абстрактного класса и интерфейса, Enum Перечисления Java.