1. Поля класу: де зберігаємо стан обʼєкта
Поле — це змінна, оголошена всередині класу, але поза всіма методами. Поля визначають «стан» обʼєкта. Наприклад, якщо маємо клас Person, то поля можуть бути такими:
- name — імʼя людини
- age — вік
- balance — баланс на рахунку (якщо, скажімо, створюємо банківський застосунок)
- isStudent — прапорець, що вказує, чи є людина студентом
Синтаксис оголошення поля
Оголошення поля схоже на оголошення звичайної змінної, лише розташоване не у методі, а безпосередньо в класі:
public class Person {
String name;
int age;
}
Тут оголошено два поля: рядок name і ціле число age. Кожне поле належатиме конкретному обʼєкту цього класу. Тобто в різних обʼєктів — свої значення. Наприклад:
Person p1 = new Person();
p1.name = "Оля";
p1.age = 20;
Person p2 = new Person();
p2.name = "Ігор";
p2.age = 25;
У першого обʼєкта імʼя — «Оля» і вік — 20, а в другого — «Ігор» і 25. Обидва створені з одного класу, але їхні поля зберігають різні дані.
Модифікатори доступу (public/private)
Поля можуть бути відкритими (public) або закритими (private). У реальному житті ви не розповідаєте всім підряд свій банківський баланс, правда? Тож у програмуванні часто роблять поля private, щоб до них не можна було звернутися напряму з інших класів. Це частина принципу інкапсуляції (докладніше — на наступних заняттях).
Приклад:
public class Person {
private String name;
private int age;
}
Поки що не ускладнюватимемо, але запамʼятайте: якщо поле private, до нього не можна звернутися напряму з іншого класу.
2. Методи класу: як обʼєкти «діють»
Метод — це функція, що описує поведінку обʼєкта. Завдяки методам обʼєкт може щось робити: говорити, рахувати, бігати, стрибати, виводити інформацію про себе тощо.
Синтаксис оголошення методу
тип_возвращаемого_значения имяМетода(параметры) {
// тело метода
}
Приклад методу, що каже «Привіт»:
public void sayHello() {
System.out.println("Привіт! Мене звати " + name);
}
Тут:
- public — модифікатор доступу.
- void — метод нічого не повертає (просто щось робить).
- sayHello — імʼя методу.
- Усередині методу ми використовуємо поле name, щоб привітати користувача.
Ще приклад: метод, що повертає вік
public int getAge() {
return age;
}
Методи можуть повертати значення (int, String тощо) або нічого не повертати — тоді пишемо void.
3. Конструктори: як «народжуються» обʼєкти
Конструктор — це особливий метод, який викликається під час створення нового обʼєкта. Його завдання — ініціалізувати поля обʼєкта початковими значеннями. Наприклад, задати людині імʼя та вік одразу під час створення, а не залишати їх порожніми.
- Імʼя конструктора завжди збігається з іменем класу.
- У конструктора немає типу, що повертається (навіть void не пишеться).
- Конструктори можуть приймати параметри (наприклад, імʼя та вік), а можуть бути без параметрів.
Приклад конструктора
public class Person {
String name;
int age;
// Конструктор із двома параметрами
public Person(String name, int age) {
this.name = name; // this.name — поле обʼєкта, name — параметр конструктора
this.age = age;
}
}
Можливо, вам цікаво, що таке this. Ключове слово this — це посилання на поточний обʼєкт. Ми використовуємо його, щоб відрізнити поле класу від параметра з тим самим іменем. Без this компілятор не зрозумів би, що саме ми ініціалізуємо.
Конструктор за замовчуванням
Якщо ви не оголосили жодного конструктора, компілятор Java автоматично додасть порожній конструктор без параметрів. Він виглядає так:
public Person() {
// нічого не робить, але дозволяє створити обʼєкт без параметрів
}
АЛЕ! Якщо ви оголосили хоча б один свій конструктор (наприклад, із параметрами), то конструктор за замовчуванням уже не створюється автоматично! Якщо він вам потрібен — напишіть його явно.
4. Приклад повного класу
Зберімо все докупи: поля, методи, конструктор.
public class Person {
String name;
int age;
// Конструктор
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Метод: сказати привіт
public void sayHello() {
System.out.println("Привіт! Мене звати " + name + ", мені " + age + " років.");
}
// Метод: збільшити вік на 1
public void haveBirthday() {
age = age + 1;
System.out.println("Ура! Мені тепер " + age + " років!");
}
}
Як це використовувати в програмі?
public class Main {
public static void main(String[] args) {
Person vasya = new Person("Вася", 18);
vasya.sayHello(); // Привіт! Мене звати Вася, мені 18 років.
vasya.haveBirthday(); // Ура! Мені тепер 19 років!
}
}
5. Практика: розвиваємо ваш застосунок
Припустімо, ви робите простий застосунок для обліку користувачів. На минулих заняттях ми працювали лише зі змінними та методами всередині main. Тепер створимо свій клас User із полями, методами та конструктором.
public class User {
String username;
int score;
// Конструктор
public User(String username, int score) {
this.username = username;
this.score = score;
}
// Метод: вивести інформацію про користувача
public void printInfo() {
System.out.println("Імʼя користувача: " + username + ", бали: " + score);
}
// Метод: збільшити бали
public void addScore(int points) {
score += points;
System.out.println(username + " отримав " + points + " балів! Тепер у нього " + score + " балів.");
}
}
Використання:
public class Main {
public static void main(String[] args) {
User alice = new User("Alice", 10);
User bob = new User("Bob", 5);
alice.printInfo(); // Імʼя користувача: Alice, бали: 10
bob.printInfo(); // Імʼя користувача: Bob, бали: 5
alice.addScore(7); // Alice отримав 7 балів! Тепер у нього 17 балів.
bob.addScore(3); // Bob отримав 3 бали! Тепер у нього 8 балів.
}
}
Зверніть увагу: у кожного обʼєкта свої поля, і зміни одного обʼєкта не впливають на інший.
6. Коротко про модифікатори доступу
У наших прикладах поля були відкритими (String name;). На практиці поля часто роблять private, щоб їх не можна було випадково (або навмисно) змінити з іншого класу. Докладніше про це поговоримо у темі інкапсуляції, а поки — приклад:
public class User {
private String username;
private int score;
public User(String username, int score) {
this.username = username;
this.score = score;
}
public void printInfo() {
System.out.println("Імʼя користувача: " + username + ", бали: " + score);
}
public void addScore(int points) {
score += points;
}
}
Тепер, якщо хтось спробує написати alice.score = 100500; поза класом, компілятор скаже: «не можна!».
7. Типові помилки під час роботи з полями, методами і конструкторами
Помилка № 1: неініціалізовані поля.
Якщо ви не задаєте значення полям, вони отримують значення за замовчуванням: числа — 0, boolean — false, посилання (наприклад, String) — null. Якщо забути ініціалізувати поле, можна отримати неочікуваний результат або навіть NullPointerException під час спроби щось із ним зробити.
Помилка № 2: плутаєте параметри та поля.
У конструкторі новачки часто пишуть просто name = name; — це не ініціалізує поле, а лише присвоює параметр самому собі. Завжди використовуйте this.name = name!
Помилка № 3: немає конструктора за замовчуванням.
Якщо ви оголосили конструктор із параметрами, але забули явно додати порожній конструктор, то new Person() вже не спрацює.
Помилка № 4: однакові імена методу та класу.
У Java імʼя конструктора зобовʼязане збігатися з іменем класу, а в методів — ні. Іноді помилково називають метод як клас, і компілятор видасть помилку.
Помилка № 5: забули про модифікатори доступу.
Якщо зробити поля public, їх можна змінювати де завгодно — це небезпечно для великих програм. Краще відразу звикати до private і використовувати методи для доступу.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ