Виды классов и типовых объявлений
Эта страница — карта, а не взаимоисключающая классификация: один класс может одновременно быть, например, 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-файле только один
publictop-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.