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

Базовый Java
≈ 3 мин чтения

Класс описывает новый тип

До этого ты работал в основном с готовыми типами: числами, строками, массивами. Но в программе часто нужны сущности из самой предметной области: пользователь, заказ, автомобиль, игровой персонаж. Для таких сущностей можно описывать собственные типы с помощью классов.

Класс — это описание типа объектов: какие действия могут выполнять такие объекты и какие данные могут быть с ними связаны. Само объявление класса ещё не создаёт объект. Оно лишь говорит Java, как устроен новый тип.

class Robot {
    void greet() {
        System.out.println("Beep!");
    }
}

Здесь появился тип Robot с уже знакомым тебе методом greet(). Теперь этот тип можно использовать так же, как другие типы Java: например, объявлять переменные типа Robot.

Объект — конкретный экземпляр класса

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

class Robot {
    void greet() {
        System.out.println("Beep!");
    }
}

public class Main {
    public static void main(String[] args) {
        Robot robot = new Robot();
        robot.greet();
    }
}

Строку Robot robot = new Robot(); удобно читать справа налево: создай объект Robot и сохрани ссылку на него в переменной robot. Затем через точку вызывается метод именно этого объекта.

Переменная хранит ссылку на объект

Объект и переменная — не одно и то же. Переменная объектного типа хранит ссылку, которая ведёт к объекту. Поэтому одну и ту же ссылку можно присвоить другой переменной. Новый объект при таком присваивании не появляется.

Robot first = new Robot();
Robot second = first;

second.greet();

После присваивания second = first обе переменные обращаются к одному и тому же объекту. Это отличается от второго вызова new Robot(): каждое отдельное выполнение new создаёт отдельный экземпляр.

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

Один класс — много объектов

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

Robot first = new Robot();
Robot second = new Robot();

first.greet();
second.greet();

Здесь first и second ссылаются уже на разные объекты, потому что new Robot() был выполнен дважды. Когда читаешь объектный код, полезно постоянно разделять три вещи: описание класса, созданный экземпляр и переменную-ссылку, через которую программа к нему обращается.