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 и использовать методы для доступа.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ