Классы 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.