Классы и объекты
До сих пор данные и методы существовали отдельно. Объект объединяет их: он хранит данные и умеет с ними работать. Такой подход называется объектно-ориентированным программированием, или ООП. Java построена на нём целиком.
Класс и объект
Класс — это чертёж, а объект — изделие, сделанное по нему. Класс описывает, какие данные будут у объекта, а сам объект создаётся оператором new:
class User {
String name;
}
void main() {
User user = new User();
user.name = "Анна";
IO.println(user.name);
}Результат:
АннаПеременные внутри класса называются полями. К полю объекта обращаются через точку. Класс можно объявить в том же файле, что и main — так все примеры главы остаются одним файлом, который легко запустить.
Методы
Метод, объявленный внутри класса, работает с данными своего объекта. Поля доступны в нём просто по имени:
class User {
String name;
String greet() {
return "Привет, " + name + "!";
}
}
void main() {
User user = new User();
user.name = "Анна";
IO.println(user.greet());
}Результат:
Привет, Анна!Метод вызывают у конкретного объекта, и он видит поля именно этого объекта.
Объекты независимы
По одному классу можно создать сколько угодно объектов. У каждого свой набор полей:
class User {
String name;
}
void main() {
User first = new User();
User second = new User();
first.name = "Анна";
second.name = "Олег";
IO.println(first.name);
IO.println(second.name);
}Результат:
Анна
ОлегЗначения по умолчанию
Если полю ничего не присвоили, у него есть значение по умолчанию: 0 для чисел, false для boolean и null для ссылочных типов, например String. Слово null означает «здесь нет объекта»:
class Product {
String title;
int price;
boolean inStock;
}
void main() {
Product p = new Product();
IO.println(p.title);
IO.println(p.price);
IO.println(p.inStock);
}Результат:
null
0
falseЛокальные переменные внутри методов такого значения не получают — их нужно присвоить до использования.
Переменная хранит ссылку
В переменной лежит не сам объект, а ссылка на него — его адрес в памяти. После присваивания обе переменные указывают на один и тот же объект:
class User {
String name;
}
void main() {
User a = new User();
a.name = "Анна";
User b = a;
b.name = "Олег";
IO.println(a.name);
}Результат:
ОлегКопии объекта не появилось: изменение через b видно и через a.
Частая ошибка
Если переменная содержит null, у неё нельзя прочитать поле или вызвать метод — объекта просто нет. Программа скомпилируется, но упадёт при запуске:
class User {
String name;
}
void main() {
User user = null;
IO.println(user.name);
}Результат:
Exception in thread "main" java.lang.NullPointerException: Cannot read field "name" because "<local1>" is null<local1> — так JVM называет локальную переменную user, когда имена переменных не сохранены при компиляции. Перед обращением к объекту убедитесь, что он создан через new.