Классы и объекты
Представь чертёж дома и сам дом. Класс — это чертёж: он описывает, что у объекта есть и что он умеет. Объект — это уже построенный по чертёжу дом. По одному чертежу можно построить сколько угодно домов — по одному классу создать сколько угодно объектов.
Как это в коде
Сначала описываешь класс (чертёж): какие у него поля и методы. Потом создаёшь объект через new.
class Dog { // чертёж
String name; // поле — что у собаки есть
void bark() { // метод — что собака умеет
System.out.println(name + ": гав!");
}
}
Dog rex = new Dog(); // построили объект по чертёжу
rex.name = "Рекс";
rex.bark(); // Рекс: гав!
Запомнить на старте:
- класс пишется с большой буквы (
Dog), объект — обычная переменная (rex); new Dog()— момент «постройки» объекта в памяти;- к полям и методам объекта обращаешься через точку:
rex.name,rex.bark().
Копнуть глубже — как на работе
Вместо того чтобы заполнять поля вручную после создания, объект обычно собирают через конструктор — специальный метод, который вызывается при new:
class Dog {
String name;
Dog(String name) { // конструктор
this.name = name;
}
}
Dog rex = new Dog("Рекс");
this — это «текущий объект», ссылка на самого себя. Она нужна, чтобы отличить поле this.name от параметра name. В реальных проектах поля чаще делают private, а доступ дают через методы — это инкапсуляция, следующая подтема.
Под капотом — для глубокого понимания
Переменная rex хранит не сам объект, а ссылку — адрес участка в heap, где объект лежит. Поэтому Dog a = rex копирует не собаку, а адрес: оба имени указывают на один объект, и изменение через один видно через другой. Сам объект живёт в heap до тех пор, пока на него есть хоть одна ссылка; когда ссылок не осталось — его заберёт сборщик мусора (GC). Это объясняет и NullPointerException: переменная-ссылка есть, а объекта за ней нет (null).
• что делает
new;• зачем нужен конструктор (если дошёл до 2-го слоя).