Из каких элементов состоит объявление класса в Java?

«Из каких элементов состоит объявление класса в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Объявление класса в Java может включать следующие элементы (в общем порядке):

  1. Модификаторы доступа и класса: public, protected, private (для вложенных), abstract, final, sealed, non-sealed, strictfp.
  2. Ключевое слово class и имя класса.
  3. Параметры типа (Generics): <T, R>.
  4. Родительский класс (наследование): extends SuperClass.
  5. Реализуемые интерфейсы: implements Interface1, Interface2.
  6. Тело класса { ... }, которое содержит:
    • Поля (Fields): Переменные для хранения состояния объекта.
      private int id;
      private static String defaultName = "Unknown"; // Статическое поле
    • Блоки инициализации:
      { /* Нестатический блок: выполняется перед каждым конструктором */ }
      static { /* Статический блок: выполняется при загрузке класса */ }
    • Конструкторы (Constructors): Специальные методы для создания экземпляров.
      public MyClass(int id) { this.id = id; }
    • Методы (Methods): Определяют поведение объекта.
      public int getId() { return id; }
      public static void printInfo() { /* статический метод */ }
    • Вложенные классы и интерфейсы:
      // Статический вложенный класс
      public static class NestedStatic { ... }
      // Внутренний класс (inner class)
      public class Inner { ... }
    • Записи (Records, Java 16+): Краткая форма для классов-данных.
      public record Point(int x, int y) { }

Полный пример:

// 1,2,3,4,5,6 - Объявление класса
public abstract class Vehicle<T extends Engine> implements Movable {
    // Поле
    private T engine;
    private static int totalVehicles = 0;

    // Статический блок инициализации
    static {
        System.out.println("Vehicle class loaded.");
    }

    // Конструктор
    public Vehicle(T engine) {
        this.engine = engine;
        totalVehicles++;
    }

    // Метод
    public void start() {
        engine.ignite();
        System.out.println("Vehicle started.");
    }

    // Абстрактный метод
    public abstract int getMaxSpeed();

    // Статический метод
    public static int getTotalVehicles() {
        return totalVehicles;
    }

    // Вложенный enum
    public enum FuelType { PETROL, DIESEL, ELECTRIC }
}