Конструкторы в Java
Напишите класс Box в Box.java с полем int по имени size и конструктором Box(int n), который выполняет size = n;. В Hall.java постройте один box через Box b = new Box(4);, затем напечатайте b.size. Скомпилируйте оба файла и запустите java Hall. Экран должен показать одну строку: 4. Число, которое вы передаёте в new, доходит до конструктора, и конструктор сохраняет его на объекте до того, как main продолжит. Сохранение поля в момент построения — внутри конструктора — то, чему учит эта страница.
Метод, который запускается, когда new строит
Конструктор носит то же имя, что и класс. У него нет возвращаемого типа void и никакого другого возвращаемого типа. Когда main пишет new Box(4), Java строит объект и запускает этот конструктор с 4 в роли n. После того как конструктор заканчивает работу, переменная держит готовый объект. Вся задача этой страницы такова: передать значение в new, дать конструктору сохранить его в поле, затем напечатать поле, чтобы увидеть, что сохранение сработало.
Сначала создайте Box.java. Строка public class — public class Box. Не оставляйте здесь старое имя класса Cup или Chip. Внутри фигурных скобок объявите int size;. Затем напишите конструктор: Box(int n) { size = n; }. На этой странице возьмите имя параметра, отличное от size, чтобы присваивание было ясным без слова this. В Box.java нет main. Сохраните перед компиляцией.
Одна строка поля сама по себе не кладёт 4 в объект. Это делает тело конструктора, когда его вызывает new. Если вы пропустите конструктор и только объявите поле, более поздний new Box(4) не совпадёт, и javac пожалуется на вызов. Держите в Box.java обе части: поле и конструктор, который в него пишет.
public class Box {
int size;
Box(int n) {
size = n;
}
}
Hall передаёт 4 в new Box
Создайте Hall.java в той же папке. Его строка public class — public class Hall. Внутри main напишите Box b = new Box(4);, затем System.out.println(b.size);. Аргумент 4 попадает в параметр конструктора n. На этой странице отдельная строка b.size = 4; не нужна — конструктор уже сохранил значение. Строка печати есть, чтобы вы могли доверять тому, что сделал конструктор, без догадок.
Держите Hall как класс, в котором есть main. Не кладите main внутрь Box для этого урока. Форма из двух файлов совпадает с более ранними страницами объектов и полей: один файл определяет тип, другой строит и использует его. Если вы переименуете файл, но оставите старую строку public class Shelf, javac откажется, пока имена снова не совпадут.
public class Hall {
public static void main(String[] args) {
Box b = new Box(4);
System.out.println(b.size);
}
}
Из папки, где лежат оба файла, выполните javac Box.java Hall.java. Вы можете сначала скомпилировать Box.java, затем Hall.java, когда оба готовы. Когда скобки, фигурные скобки и точки с запятой совпадают, javac не пишет своей строки. Затем запустите java Hall — не java Hall.java и не java Box. Уберите окончание .java из команды запуска. Запускайте класс, в котором есть main. Те же команды работают в Windows и в macOS.
Программа должна напечатать одну строку и остановиться: 4. Она не просит вас вводить текст. Если терминал ждёт ввода с клавиатуры, в каком-то файле ещё остался вызов nextLine из старого упражнения. Удалите этот вызов и оставьте в Hall new Box(4) плюс печать, а конструктор — в Box. Ожидающий курсор — не проблема конструктора; это оставшийся код ввода не на своём месте.
Пройдите запуск один раз. Java начинает с Hall.main. Выражение new Box(4) строит Box и вызывает Box(int n) с n, равным 4. Тело пишет size = n, поэтому size этого объекта становится 4. Затем main печатает b.size, и экран показывает 4. Больше ничего печататься не должно. Если вы видите ok, 3 или остаток Cup, вы не запускаете программу Hall с этой страницы.
Если вы напишете new Box() без аргумента, пока единственный конструктор требует int, javac откажет. Сопоставьте вызов со списком параметров конструктора. Если перед именем конструктора добавить void, это станет обычным методом, а не конструктором, и new Box(4) не запустит то тело так, как ожидает эта страница. Заголовок должен выглядеть как Box(int n), не void Box(int n) и не static int Box(int n).
Сравнение с присваиванием после new
На странице полей вы писали c.fill = 3; после new Cup(). Это по-прежнему работает. Эта страница переносит сохранение внутрь конструктора, чтобы значение задавалось, пока объект строится. Оставшийся демо-пример Cup с c.fill = 3; — другой урок. Для этой страницы держите Box, Hall и new Box(4). Если в Hall ещё есть c.fill = 3;, а в этой папке нет класса Cup, уберите эту строку. Компилятор не изобретёт Cup за вас.
Печать самого b через System.out.println(b); не показывает чистое 4. Печатайте b.size, чтобы увидеть сохранённое число. Ссылка на объект сама по себе — не значение поля. Этот шаблон вы уже видели на странице полей; держите его и здесь, когда проверяете работу конструктора.
В других программах вы всё ещё можете присваивать поле после new. Этот урок просто выбирает путь через конструктор, чтобы первое полезное значение приходило в момент построения. Не смешивайте оба стиля в одном демо Hall на этой странице. Одного ясного пути достаточно: аргумент в new, сохранение в конструкторе, печать поля.
Два box, два size
Каждый new Box(...) снова запускает конструктор для отдельного объекта. Вы можете написать Box a = new Box(2); и Box b = new Box(9);, затем напечатать оба поля size. Первый вызов сохраняет 2 на одном объекте. Второй вызов сохраняет 9 на другом объекте. Два объекта не делят один слот size.
public class Hall {
public static void main(String[] args) {
Box a = new Box(2);
Box b = new Box(9);
System.out.println(a.size);
System.out.println(b.size);
}
}
Скомпилируйте и запустите снова: javac Box.java Hall.java, затем java Hall. Экран должен показать 2 в одной строке и 9 в следующей. Каждый вызов конструктора сохранил свой аргумент на своём объекте. Запись Box b = a; не строит второй объект — используйте два вызова new Box(...), когда хотите два size. Копирование ссылки — не то же самое, что дважды вызвать конструктор.
Если обе строки показывают одно и то же число, проверьте, что каждый new передаёт разный аргумент и что вы печатаете a.size и b.size в этом порядке. Если javac останавливается на втором new, ищите пропущенную скобку или неверное имя класса из старого файла. Мелкие опечатки во втором вызове обычны, когда вы копируете первую строку и забываете сменить аргумент.
Что остаётся для this
Эта страница использует size = n; с разными именами. Более поздняя страница — this — покажет, как говорить о собственном поле объекта, когда имена сталкиваются. Здесь оставайтесь с ясным именем параметра n. Не изобретайте this.size на этой странице, если вы уже его не знаете; цель урока — вызов конструктора из new. Слово this — следующая тема, а не требование для сохранения n в size сегодня.
Если javac не находит Box при компиляции Hall.java, проверьте, что Box.java лежит в той же папке и что строка класса — public class Box. Если экран показывает 0, у конструктора может отсутствовать присваивание, или main всё ещё использует форму без аргументов, которая никогда не задаёт size — держите Box(int n) { size = n; } и new Box(4). Ноль на экране обычно значит, что поле осталось со значением по умолчанию, потому что сохранение не запускалось.
Когда в папке ещё лежат Cup.java или Shelf.java со страницы полей, оставьте их в покое или удалите только если они путают команду компиляции. Не компилируйте старый Shelf, который всё ещё присваивает c.fill, и не ждите экран этой страницы. Запускайте java Hall после того, как скомпилируете пару Box и Hall из этого урока.
Перед this
Вы можете объявить int size;, написать Box(int n) { size = n; } и построить через Box b = new Box(4); из Hall. Скомпилируйте оба файла и запустите java Hall. Экран показывает 4. Конструктор запускается, когда new строит объект. Вы передали число в момент построения, конструктор сохранил его в поле, и печать подтвердила сохранение. Следующая страница — this, где вы учитесь другому способу именовать собственные поля объекта внутри его методов и конструкторов.
Держите заголовок конструктора без void. Держите аргумент на new. Держите печать на b.size. Эти три привычки — контрольная точка этой страницы перед тем, как идти дальше.
🧠 Проверьте Свои Знания
Проверьте Свои Знания
Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему
📝 Инструкции
- Внимательно прочитайте каждый вопрос
- Выберите лучший ответ на каждый вопрос
- Вы можете пересдавать тест столько раз, сколько захотите
- Ваш прогресс будет показан вверху