Гид по технологиям

Создание классов в Java

6 min read Программирование Обновлено 31 Dec 2025
Создание классов в Java: практическое руководство
Создание классов в Java: практическое руководство

Разработчик пишет код на Java

Кратко — TL;DR

Классы в Java задают шаблон (структуру и поведение) для объектов. Научитесь объявлять класс, добавлять атрибуты, писать конструкторы (по умолчанию, основной, конструктор копирования) и применять модификаторы доступа. Сосредоточьтесь на инкапсуляции (private поля + публичные методы) и выбирайте композицию вместо наследования, когда это целесообразно.

Важно: конструктор может быть не только public — приватный конструктор полезен для паттернов (например, Singleton) и фабрик.

Что такое класс и объект

Кратко: класс — это «чертёж» для создания объектов; объект — экземпляр этого чертежа с конкретным состоянием.

Определение в одну строку: объект — это набор полей (состояние) и методов (поведение), созданный на основе класса.

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

Зачем создавать классы в Java

Классы структурируют код, уменьшают дублирование и облегчают поддержку. Вместо того чтобы копировать одно и то же состояние и поведение для похожих сущностей, вы описываете шаблон один раз и создаёте объекты по необходимости.

Бонусы при правильном проектировании:

  • легче тестировать;
  • проще понимать код;
  • повышается повторное использование;
  • улучшается безопасность данных через инкапсуляцию.

Объявление класса

Каждый класс объявляют с ключевого слова class; часто перед ним ставят модификатор доступа, например public, чтобы класс был видим в других пакетах.

Правила именования:

  • Имя класса обычно начинается с заглавной буквы (CamelCase).
  • Имя должно отражать ответственность класса (SRP — single responsibility principle).

Пример минимального объявления класса:

public class Student {
}

Фигурные скобки { } ограничивают тело класса: здесь лежат поля, конструкторы и методы.

Поля (атрибуты) класса

Поля (fields) — это переменные, которые описывают состояние объекта. Обычно их делают приватными (private) и предоставляют публичные методы доступа (геттеры/сеттеры).

Пример класса со свойствами:

public class Student {
    // поля (переменные экземпляра)
    private String fname;
    private String lname;
    private int age;
    private String courseOfStudy;
}

Разбор строки объявления поля:

  • модификатор доступа: private / public / protected / package-private;
  • тип данных: String, int, boolean и т.д.;
  • имя переменной: fname, age и т.д.

Примечания:

  • String — ссылка на объект строки, начинающаяся с заглавной буквы;
  • int — примитивный целочисленный тип, в нижнем регистре;
  • Java чувствительна к регистру.

Конструкторы

Конструктор — это специальный метод, который инициализирует новый объект при создании. Он имеет имя класса и не возвращает значение.

Типы конструкторов (основные подходы):

  • конструктор по умолчанию (без параметров);
  • основной (параметризованный) конструктор;
  • конструктор копирования (создаёт новый объект как копию другого).

Пример: класс с конструктором по умолчанию

public class Student {
    private String fname;
    private String lname;
    private int age;
    private String courseOfStudy;

    // конструктор по умолчанию
    public Student() {
        this.fname = "John";
        this.lname = "Doe";
        this.age = 20;
        this.courseOfStudy = "Psychology";
    }
}

Когда вы вызываете new Student(), сработает конструктор по умолчанию и задаст значения полей.

Пример: параметризованный (основной) конструктор

public class Student {
    private String fname;
    private String lname;
    private int age;
    private String courseOfStudy;

    // конструктор по умолчанию
    public Student() {
        this.fname = "John";
        this.lname = "Doe";
        this.age = 0;
        this.courseOfStudy = "Psychology";
    }

    // параметризованный конструктор
    public Student(String fname, String lname, int age, String courseOfStudy) {
        this.fname = fname;
        this.lname = lname;
        this.age = age;
        this.courseOfStudy = courseOfStudy;
    }
}

Ключевое слово this указывает на поле текущего объекта и помогает различать параметр и поле с одинаковыми именами.

Пример: конструктор копирования

public class Student {
    private String fname;
    private String lname;
    private int age;
    private String courseOfStudy;

    // конструктор копирования
    public Student(Student other) {
        this.fname = other.fname;
        this.lname = other.lname;
        this.age = other.age;
        this.courseOfStudy = other.courseOfStudy;
    }
}

Конструктор копирования создаёт новый объект с теми же значениями полей, что и переданный объект.

Примечание: если поля содержат изменяемые объекты (например, список), учитывайте необходимость глубокой копии.

Инкапсуляция и модификаторы доступа

Инкапсуляция — ограничение доступа к внутреннему состоянию объекта. Стандартный приём: private поля + public методы доступа (get/set). Это позволяет контролировать валидацию и обеспечивает безопасность состояния.

Пример геттеров и сеттеров:

public String getFname() {
    return fname;
}

public void setFname(String fname) {
    if (fname == null || fname.isEmpty()) {
        throw new IllegalArgumentException("Имя не может быть пустым");
    }
    this.fname = fname;
}

Композиция vs наследование

Ментальная модель: композиция — «имеет» (has-a), наследование — «является» (is-a).

Правило-эвристика: сначала попробуйте композицию; используйте наследование, когда подкласс действительно расширяет или уточняет поведение родителя и не нарушает Liskov Substitution Principle.

Когда классы избыточны (контрпример)

  • Небольшие структуры данных, где уместен record (Java 16+);
  • Утилитарные функции — статические методы в классе-утилите;
  • Простые перечисления — enum;
  • Если объект не хранит состояние — можно использовать статические функции или функциональные интерфейсы.

Альтернативы и современные возможности Java

  • record (Java 16+) — компактное описание неизменяемых объектов;
  • Lombok — генерация геттеров/сеттеров/конструкторов на этапе компиляции (внешняя библиотека);
  • Builder pattern — удобен при большом количестве опциональных полей.

Мини-методология проектирования класса (шаги)

  1. Определите ответственность — одну основную задачу.
  2. Выберите имя, отражающее эту ответственность.
  3. Решите, какие данные (поля) нужны и какие должны быть приватными.
  4. Опишите публичный API — методы, которые будут использоваться внешне.
  5. Реализуйте конструкторы и подумайте о фабриках или билдере для сложных сценариев.
  6. Добавьте валидацию в сеттеры/конструкторы.
  7. Напишите юнит-тесты.

Чек-лист для роли: разработчик / ревьюер / тестировщик

  • Разработчик:

    • класс выполняет одну ответственность;
    • поля приватны;
    • есть необходимые конструкторы;
    • нет утечек мутабельных полей;
    • комментарии/документация при необходимости.
  • Ревьюер:

    • читаемость и имена;
    • проверка на NullPointer и валидацию;
    • проверка циклических зависимостей;
    • соблюдение принципов SOLID.
  • Тестировщик:

    • тесты конструктора(ов);
    • тесты геттеров/сеттеров с валидацией;
    • тесты поведения методов в граничных условиях.

Критерии приёмки

  • Класс компилируется без ошибок.
  • Имеются юнит-тесты, покрывающие основные сценарии: создание, валидация, поведение методов.
  • Нет публичных mutable-полей.
  • Документация или JavaDoc для публичного API.

Тест-кейсы / приёмка (примеры)

  • Создание Student() по умолчанию — поля заполнены значениями по умолчанию.
  • Создание Student(“Иван”, “Иванов”, 21, “Math”) — значения соответствуют переданным параметрам.
  • При попытке установить пустое имя — выбрасывается IllegalArgumentException.
  • Копирование через конструктор копирования даёт независимый объект (для неизменяемых полей необходимо подтвердить).

Краткий справочник (cheat sheet)

  • class MyClass { } — объявление класса;
  • private Type field; — приватное поле;
  • public MyClass() { } — конструктор по умолчанию;
  • public MyClass(Type arg) { this.field = arg; } — параметризованный конструктор;
  • public Type getField() / public void setField(Type field) — геттер/сеттер;
  • this.field — доступ к полю текущего объекта.

Короткий глоссарий (1 строка на термин)

  • Класс: шаблон для создания объектов.
  • Объект: экземпляр класса с состоянием и поведением.
  • Поле: переменная экземпляра, описывающая состояние.
  • Конструктор: метод инициализации объекта.
  • Инкапсуляция: сокрытие внутренних данных объекта.

Безопасность и приватные конструкторы

Иногда конструктор делают private для контроля создания экземпляров (фабричные методы, паттерн Singleton). Это нормальная практика, но тогда создание объектов извне ограничено специальным API.

Советы по миграции / совместимости

  • При переходе на record: используйте record для неизменяемых DTO;
  • Для сложной логики оставляйте обычные классы;
  • Если применяете Lombok — убедитесь в совместимости с используемыми инструментами сборки.

Примеры ошибок и как их избежать

  1. Публичные изменяемые поля — используйте приватные поля и методы доступа.
  2. Неинициализированные поля — всегда устанавливайте значения в конструкторах или явно при объявлении.
  3. Неправильное использование наследования — проверьте, действительно ли подкласс является типом родителя.

Итог / Что важно запомнить

  • Класс — основа объектно-ориентированного кода в Java.
  • Делайте поля private и предоставляйте контролируемый доступ через методы.
  • Используйте конструкторы для контроля инвариантов объекта.
  • Композиция часто предпочтительнее наследования.

Image Credit: Christina Morillo/ Pexels

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство