- Писать класс с полями, конструктором и методами и создавать из него объекты
- Объяснять смысл ключевого слова
this - Инкапсулировать объект с помощью
private-полей, геттеров и сеттеров
Приложение такси отслеживает тысячи машин: у каждой есть марка, год выпуска и пробег, и каждая умеет ехать. Заводить отдельные переменные для каждой машины невозможно. Ответ Java — классы: ты один раз описываешь, что такое машина, а потом создаёшь по этому описанию сколько угодно объектов.
Класс, объект и конструктор
Класс — чертёж объектов: он описывает, какие данные будет хранить объект (поля) и что он умеет делать (методы). Объект — конкретный экземпляр, созданный оператором new. При создании объекта запускается особый метод — конструктор: его имя совпадает с именем класса, и у него нет возвращаемого типа.
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) методы.
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-поле принадлежит не отдельным объектам, а всему классу: у него одна копия, общая для всех объектов.
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
Главное
- Класс — чертёж, объект — конкретный экземпляр, созданный через
new. - Конструктор называется как класс, не имеет возвращаемого типа и задаёт начальные значения полей.
this— текущий объект;this(...)вызывает другой конструктор того же класса.- Инкапсуляция: поля
private, доступ — через геттеры, сеттеры и методы с проверкой. static-поле общее для всех объектов; переменные объектного типа хранят ссылки.
Проверь себя
Вопросов: 10. Каждый правильный ответ приносит XP.