В этих примерах я разбираю инкапсуляцию — один из главных принципов ООП.
Вместо того чтобы напрямую обращаться к полям, я использую методы setLogin(), setPassword(), setTitle() и другие.
Это помогает:
- Защитить данные — поля не доступны напрямую
- Добавить логику — например, проверить пароль или форматировать вывод
- Упростить изменения — можно поменять логику внутри метода, не трогая остальной код
class Account {
String login;
String password;
public void setLogin(String log) {
login = log;
}
public void setPassword(String pw) {
password = pw;
}
public boolean check(String login, String password) {
return this.login.equals(login) && this.password.equals(password);
}
}Класс AccountMain:
public class AccountMain {
public static void main(String[] args) {
Account acc = new Account();
acc.setLogin("admin");
acc.setPassword("1234");
System.out.println(acc.check("admin", "1234"));
System.out.println(acc.check("admin", "0000"));
}
}Вывод в консоли
true
false
Как это работает
setLogin()иsetPassword()— устанавливают значенияcheck()— проверяет, совпадают ли логин и пароль с сохранённымиthis.login— обращается к полю объекта, а не к параметру методаequals()— сравнивает строки по значению, а не по ссылке
Класс Note:
class Note {
String title;
String content;
public void setTitle(String t) {
title = t;
}
public void setContent(String c) {
content = c;
}
public String getNote() {
return "Заметка: " + title + " - " + content;
}
}Класс NoteMain:
public class NoteMain {
public static void main(String[] args) {
Note one = new Note();
one.setTitle("Список дел");
one.setContent("1. Помыть кота");
System.out.println(one.getNote());
}
}Вывод в консоли
Заметка: Список дел - 1. Помыть кота
Как это работает
setTitle()иsetContent()— заполняют поляgetNote()— возвращает собранную строку с форматированием- Вся логика форматирования спрятана внутри метода
Код
Класс Player:
class Player {
String name;
int score;
public void addScore(int points) {
score += points;
}
public void reset() {
score = 0;
}
public String getInfo() {
return "Игрок: " + name + ", Очки: " + score;
}
}Класс PlayerMain:
public class PlayerMain {
public static void main(String[] args) {
Player one = new Player();
one.name = "Alex";
one.score = 0;
one.addScore(10);
System.out.println(one.getInfo());
one.addScore(15);
System.out.println(one.getInfo());
one.reset();
System.out.println(one.getInfo());
one.addScore(5);
System.out.println(one.getInfo());
}
}Вывод в консоли
Игрок: Alex, Очки: 10
Игрок: Alex, Очки: 25
Игрок: Alex, Очки: 0
Игрок: Alex, Очки: 5
Как это работает
nameиscore— заданы напрямую (но лучше через конструктор или сеттеры)addScore()— увеличивает счёт на переданное значениеreset()— обнуляет счётgetInfo()— возвращает форматированную строку с состоянием игрока
Пример 1 (Account):
- Сеттеры для установки данных
- Метод
check()проверяет совпадение
Пример 2 (Note):
- Сеттеры для установки данных
- Геттер
getNote()форматирует вывод
Пример 3 (Player):
- Прямой доступ к полям (менее защищённый способ)
- Методы
addScore(),reset(),getInfo()изменяют и возвращают состояние
- Сеттеры — нужны для установки значений (вместо прямого обращения к полям)
- Геттеры — возвращают значения (часто с форматированием)
- Инкапсуляция — скрывает детали реализации внутри класса
this— указывает на текущий объектequals()— сравнивает строки по значению
- В примере с
Playerполя задаются напрямую(one.name = "Alex")— это быстрее, но небезопасно - В идеале все поля должны быть
privateи закрыты через геттеры/сеттеры - Сеттеры позволяют добавить проверку в будущем (например, пароль не короче 4 символов)
⭐ Инкапсуляция — это основа ООП. Теперь я умею защищать данные и управлять доступом к ним.