Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

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

До сих пор данные и методы существовали отдельно. Объект объединяет их: он хранит данные и умеет с ними работать. Такой подход называется объектно-ориентированным программированием, или ООП. 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.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.