Классы Java

Класс определяет структуру состояния, поведение и правила создания объектов. Каждый объект имеет runtime-тип и идентичность; его поля хранят состояние, методы реализуют операции.

public final class Counter {
    private final String name;
    private int value;
 
    public Counter(String name) {
        this.name = Objects.requireNonNull(name);
    }
 
    public int increment() {
        return ++value;
    }
 
    public int value() {
        return value;
    }
}

Здесь конструктор устанавливает инвариант name != null, поле value получает 0 по умолчанию, а изменение спрятано за методом.

Состав класса

  • поля экземпляра и static-поля;
  • конструкторы;
  • экземплярные и static-методы;
  • блоки инициализации;
  • вложенные типы;
  • параметры типа, наследование и реализуемые интерфейсы.

Все классы, кроме Object, имеют один непосредственный суперкласс. Если extends не указан, это Object. Интерфейсов можно реализовать несколько.

Объект и ссылка

Counter a = new Counter("requests");
Counter b = a;
b.increment();
System.out.println(a.value()); // 1: ссылки ведут к одному объекту

Присваивание ссылочной переменной не копирует объект. Сравнение == проверяет идентичность ссылок, а equals — логическое равенство по контракту класса.

Границы проектирования

  • поля не должны бесконтрольно раскрывать изменяемое состояние;
  • конструктор не должен публиковать незавершённый this;
  • наследование выбирают только для отношения подтипа;
  • большой класс с несвязанными причинами изменения стоит разделить;
  • record удобен для value-like данных, но не гарантирует глубокую неизменяемость.

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

Копируется ли объект при b = a? Нет, копируется ссылка.

Какой родитель у класса без extends? Object.

Может ли класс наследовать два класса? Нет, но может реализовать несколько интерфейсов.

Чем поле класса отличается от локальной переменной? Поле получает default value; локальная переменная должна быть явно присвоена до чтения.

Связано: Виды классов Java, Класс Object, Классы и методы Java объекты, Equals и hashCode.