Классы и объекты
Класс описывает новый тип
До этого ты работал в основном с готовыми типами: числами, строками, массивами. Но в программе часто нужны сущности из самой предметной области: пользователь, заказ, автомобиль, игровой персонаж. Для таких сущностей можно описывать собственные типы с помощью классов.
Класс — это описание типа объектов: какие действия могут выполнять такие объекты и какие данные могут быть с ними связаны. Само объявление класса ещё не создаёт объект. Оно лишь говорит 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() был выполнен дважды.
Когда читаешь объектный код, полезно постоянно разделять три вещи:
описание класса, созданный экземпляр и переменную-ссылку, через которую программа к нему обращается.