Классы и объекты

Тема дорожной карты · Java

Классы и объекты в Java — фундаментальные единицы объектно-ориентированного программирования: класс выступает чертежом, определяющим поля, конструкторы и методы, а объект — конкретным экземпляром этого чертежа, размещённым в куче JVM. Класс определяется с помощью ключевого слова class, состояние объявляется как поля (например, private String name;), а конструкторы инициализируют это состояние — компилятор автоматически генерирует конструктор без аргументов только при отсутствии явно заданного конструктора. Каждый Java-объект наследует от java.lang.Object, предоставляющего универсальные методы equals(), hashCode(), toString(), getClass() и clone() — согласованное переопределение equals и hashCode обязательно, когда объекты помещаются в Collections типа HashMap или HashSet. Статические члены принадлежат классу, а не конкретному объекту, и инициализируются при первой загрузке класса ClassLoader — они подходят для констант (static final) и фабричных методов. Классы и объекты в Java — строительные блоки каждого Spring-компонента (@Component, @Service, @Repository), каждой JPA-сущности @Entity и каждого JDBC data-transfer object, поэтому владение их жизненным циклом — от создания до сборки мусора JVM GC — является обязательным знанием для всей экосистемы Java.

Как это работает

Классы и объекты в Java строится на классах, наследовании (extends), интерфейсах (implements), полиморфизме (override + динамическая диспетчеризация), инкапсуляции (private-поля + public-методы), композиции (предпочтительнее наследования). Современная Java добавляет records (immutable носители данных), sealed классы/интерфейсы (закрытые иерархии для pattern matching), default-методы интерфейсов (эволюция без слома implementers).

Когда применять

Композиция (класс has-a) лучше наследования (класс is-a) по умолчанию — Liskov substitution исключает многие "is-a", выглядящие интуитивно. Records — для immutable data-классов. Sealed-типы — когда иерархия конечна (Shape — это Circle, Square или Triangle). Избегайте глубоких иерархий (>2-3 уровней = сигнал плохого дизайна).

Типичные ошибки

Ловушки Классы и объекты: глубокие иерархии наследования, в которых "find usages" IDE не разберётся; mutable-поля без thread-safety на shared-объектах; override equals без hashCode (сломано в любом HashMap); toString сущности случайно выставляет колонку БД (утечка в логи); абстрактные базовые классы, смешивающие concern (разделяйте).

Связанные понятия

Полезные ресурсы