Перейти к содержанию
Educora
Средний18 мин7 / 18

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

Создавай собственные типы: поля, конструкторы, this, методы, инкапсуляция, геттеры и сеттеры, static-члены.

Проверь себя
В этом уроке ты узнаешь
  • Писать класс с полями, конструктором и методами и создавать из него объекты
  • Объяснять смысл ключевого слова this
  • Инкапсулировать объект с помощью private-полей, геттеров и сеттеров

Приложение такси отслеживает тысячи машин: у каждой есть марка, год выпуска и пробег, и каждая умеет ехать. Заводить отдельные переменные для каждой машины невозможно. Ответ Java — классы: ты один раз описываешь, что такое машина, а потом создаёшь по этому описанию сколько угодно объектов.

Класс, объект и конструктор

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

Java
public class Main {
    public static void main(String[] args) {
        Car first = new Car("Toyota", 2019);
        Car second = new Car("Kia", 2023);
        first.drive(120);
        first.drive(35);
        second.drive(60);
        System.out.println(first.brand + ": " + first.mileage + " km");
        System.out.println(second.brand + ": " + second.mileage + " km");
    }
}

class Car {
    String brand;
    int year;
    int mileage;

    Car(String brand, int year) {
        this.brand = brand;
        this.year = year;
        this.mileage = 0;
    }

    void drive(int km) {
        mileage += km;
    }
}
Ожидаемый результат
Toyota: 155 km
Kia: 60 km
  • У класса Car три поля (brand, year, mileage) и один метод (drive).
  • new Car("Toyota", 2019) создаёт в памяти новый объект и вызывает конструктор.
  • **this** — сам текущий объект. В записи this.brand = brand слева стоит поле объекта, а справа — параметр конструктора; так как имена совпадают, this их различает.
  • У каждого объекта свои поля: first проехал 155 км, а second — 60 км, и они не влияют друг на друга.

Инкапсуляция: геттеры и сеттеры

В классе Car кто угодно может написать first.mileage = -500; — а это бессмыслица. Инкапсуляция означает скрыть данные объекта и давать к ним доступ только через методы с проверкой. Поля объявляют private, а для чтения пишут геттеры, для изменения — сеттеры или другие открытые (public) методы.

Java
public class Main {
    public static void main(String[] args) {
        BankAccount acc = new BankAccount("Leyla", 50);
        acc.deposit(30);
        acc.withdraw(100);
        acc.withdraw(20);
        System.out.println(acc.getOwner() + " has " + acc.getBalance() + " AZN");
        System.out.println(acc);
    }
}

class BankAccount {
    private final String owner;
    private double balance;

    BankAccount(String owner, double balance) {
        this.owner = owner;
        this.balance = balance;
    }

    public String getOwner() { return owner; }
    public double getBalance() { return balance; }

    public void deposit(double amount) {
        if (amount > 0) balance += amount;
    }

    public void withdraw(double amount) {
        if (amount > balance) {
            System.out.println("Not enough money!");
            return;
        }
        balance -= amount;
    }

    @Override
    public String toString() {
        return "BankAccount[" + owner + ", " + balance + "]";
    }
}
Ожидаемый результат
Not enough money!
Leyla has 60.0 AZN
BankAccount[Leyla, 60.0]

Теперь баланс могут менять только методы deposit и withdraw, и они соблюдают правила: отрицательные суммы не принимаются, а снять больше, чем есть на счёте, нельзя. Поле owner — final: оно задаётся один раз в конструкторе и больше не меняется, поэтому у него нет сеттера. Метод toString() определяет, как объект будет выглядеть при выводе через println.

МодификаторКому доступно?
publicвсем
protectedтот же пакет и классы-наследники
(без модификатора)только тот же пакет
privateтолько сам класс
Модификаторы доступа — от самого открытого к самому закрытому

Несколько конструкторов и static-члены

Конструкторы, как и методы, можно перегружать. Один конструктор может вызвать другой через this(...) — так код не повторяется. А static-поле принадлежит не отдельным объектам, а всему классу: у него одна копия, общая для всех объектов.

Java
public class Main {
    public static void main(String[] args) {
        Student a = new Student("Aysel");
        Student b = new Student("Murad", 9);
        System.out.println(a.info());
        System.out.println(b.info());
        System.out.println("Students created: " + Student.count);
        Student c = b;
        c.setGrade(10);
        System.out.println(b.info());
    }
}

class Student {
    static int count = 0;
    private String name;
    private int grade;

    Student(String name, int grade) {
        this.name = name;
        setGrade(grade);
        count++;
    }

    Student(String name) {
        this(name, 5);
    }

    public void setGrade(int grade) {
        if (grade >= 1 && grade <= 11) {
            this.grade = grade;
        }
    }

    public String info() {
        return name + ", grade " + grade;
    }
}
Ожидаемый результат
Aysel, grade 5
Murad, grade 9
Students created: 2
Murad, grade 10
1 / 5

Главное

  • Класс — чертёж, объект — конкретный экземпляр, созданный через new.
  • Конструктор называется как класс, не имеет возвращаемого типа и задаёт начальные значения полей.
  • this — текущий объект; this(...) вызывает другой конструктор того же класса.
  • Инкапсуляция: поля private, доступ — через геттеры, сеттеры и методы с проверкой.
  • static-поле общее для всех объектов; переменные объектного типа хранят ссылки.

Проверь себя

Вопросов: 10. Каждый правильный ответ приносит XP.

1 / 10
Чем конструктор отличается от обычного метода?