Классы и объекты в Java - Вопросы

Всего: 5 вопросов

1. 

Чем класс отличается от объекта в Java?

Класс — это шаблон (описание, тип данных): он перечисляет поля и методы и существует уже на этапе написания и компиляции кода. Объект — это конкретный экземпляр, созданный по шаблону оператором new во время выполнения программы. Описание класса загружается JVM один раз, а каждый объект занимает свой участок памяти в куче (heap) и хранит собственную копию полей. По одному классу можно создать сколько угодно объектов, и значения полей у каждого будут свои: class Box { double width; } — это класс, а Box myBox = new Box(); — объект. Бытовая аналогия: класс — чертёж дома, объект — построенный по этому чертежу дом.

2. 

Как создать объект в Java и какие значения получают его поля сразу после создания?

Создание объекта — двухэтапный процесс. Сначала объявляется переменная типа класса (Box myBox;) — она пока не содержит объект, а только может на него ссылаться. Затем оператор new резервирует память под объект в куче и возвращает ссылку: myBox = new Box();. Обычно оба шага пишут одной строкой: Box myBox = new Box();. Круглые скобки после имени класса — это вызов конструктора; если в классе не объявлен ни один конструктор, компилятор добавляет конструктор без параметров автоматически. Сразу после создания все поля объекта получают значения по умолчанию для своего типа: 0 (или 0.0) для чисел, false для boolean, null для ссылочных типов. Важно: значения по умолчанию получают только поля объекта и статические поля — локальные переменные внутри метода не инициализируются автоматически, и чтение такой переменной до присваивания — ошибка компиляции «variable might not have been initialized».

3. 

Что происходит при выполнении Box b2 = b1; — создаётся ли новый объект?

Нет. Строка Box b2 = b1; копирует ссылку, а не сам объект: новая коробка не создаётся, обе переменные указывают на один и тот же объект в куче. Поэтому изменение через любую из переменных видно через обе:

Box b1 = new Box();
Box b2 = b1;

b1.width = 10;
b2.width = 3;

System.out.println(b1.width);   // 3.0
System.out.println(b2.width);   // 3.0

Чтобы получить независимую копию, объект нужно создать заново оператором new и перенести значения полей (или клонировать объект).

4. 

Какие методы есть у объекта любого класса и откуда они берутся?

Любой класс в Java неявно наследуется от java.lang.Object: запись class Box {} компилятор понимает как class Box extends Object {}. Поэтому даже у объекта пустого класса сразу доступны методы класса Object: toString() — строковое представление, по умолчанию возвращает что-то вроде Box@1b6d3586 (имя класса и хеш-код в шестнадцатеричном виде); equals(Object obj) — сравнение, по умолчанию сравнивает ссылки, то есть работает так же, как ==; hashCode() — целочисленный хеш-код, нужен для работы HashMap и HashSet; getClass() — возвращает объект Class с информацией о типе во время выполнения; а также clone(), wait(), notify() и notifyAll(). Методы toString(), equals() и hashCode() почти всегда переопределяют в своих классах, чтобы объекты печатались читаемо и сравнивались по значению, а не по ссылке.

5. 

Какие ошибки чаще всего допускают новички при работе с классами и объектами в Java?

Пять типичных ошибок. 1. Обращение к полю без создания объекта: строка Box myBox; объявляет только ссылку, и myBox.width = 10; без new даст ошибку компиляции, а если ссылке присвоен nullNullPointerException во время выполнения. 2. Сравнение объектов через ==: этот оператор сравнивает ссылки, а не содержимое, поэтому два разных объекта с одинаковыми полями дадут false; для сравнения по значению нужен переопределённый equals(). 3. Путаница между копией ссылки и копией объекта: Box b2 = b1; не создаёт вторую коробку, оба имени указывают на одну. 4. Вызов нестатического метода из main напрямую: getVolume() принадлежит объекту и вызывается как myBox.getVolume(), иначе будет ошибка «non-static method cannot be referenced from a static context». 5. Имя файла не совпадает с именем public-класса: public class Box обязан лежать в файле Box.java.

Страница 1 из 1