Методы экземпляра в Java
Напишите класс Jar в Jar.java с полем int по имени fill, конструктором Jar(int n), который выполняет fill = n;, и методом экземпляра void bump(), который выполняет fill = fill + 1;. В Desk.java постройте один jar через Jar j = new Jar(3);, вызовите j.bump();, затем напечатайте j.fill. Скомпилируйте оба файла и запустите java Desk. Экран должен показать одну строку: 4. Метод выполняется на том одном объекте и меняет его поле. Вызов метода через переменную объекта — то, чему учит эта страница.
Метод, который принадлежит объекту
На более ранних страницах о методах вы вызывали имя из main без объекта впереди. Здесь метод сидит на классе, но вы доходите до него через переменную jar: j.bump(). Этот вызов использует поля того jar, который называет j. Второй jar хранит свой собственный fill.
Сначала создайте Jar.java. Строка public class — public class Jar. Не оставляйте здесь старое имя класса Tin или Box. Внутри фигурных скобок объявите int fill;. Напишите конструктор Jar(int n) { fill = n; } с разными именами, чтобы этой странице не понадобился this. Затем напишите метод экземпляра:
void bump() { fill = fill + 1; }
В Jar.java нет main. Сохраните перед компиляцией. Заголовку метода нужен void, потому что bump не возвращает значение для печати. У конструктора по-прежнему нет void — держите это различие ясным.
public class Jar {
int fill;
Jar(int n) {
fill = n;
}
void bump() {
fill = fill + 1;
}
}
Desk строит jar и вызывает bump
Создайте Desk.java в той же папке. Его строка public class — public class Desk. Внутри main напишите три строки по порядку: Jar j = new Jar(3);, затем j.bump();, затем System.out.println(j.fill);. Конструктор сохраняет 3. Вызов j.bump() добавляет единицу. Печать показывает новое значение.
Держите Desk как класс, в котором есть main. Не кладите main внутрь Jar для этого урока. Если в папке ещё лежит оставшийся файл Lab со страницы this, не запускайте для этого урока java Lab — после компиляции Jar.java и Desk.java выполните java Desk.
public class Desk {
public static void main(String[] args) {
Jar j = new Jar(3);
j.bump();
System.out.println(j.fill);
}
}
Из папки, где лежат оба файла, выполните javac Jar.java Desk.java. Вы можете сначала скомпилировать Jar.java, затем Desk.java, когда оба готовы. Когда скобки, фигурные скобки и точки с запятой совпадают, javac не пишет своей строки. Затем запустите java Desk — не java Desk.java и не java Jar. Уберите окончание .java из команды запуска. Запускайте класс, в котором есть main. Те же команды работают в Windows и в macOS.
Программа должна напечатать одну строку и остановиться: 4. Она не просит вас вводить текст. Если терминал ждёт ввода с клавиатуры, в каком-то файле ещё остался вызов nextLine из старого упражнения. Удалите этот вызов и оставьте в Desk new Jar(3), j.bump() и печать, а в Jar — bump.
Пройдите запуск один раз. Java начинает с Desk.main. Выражение new Jar(3) строит jar и сохраняет 3 в fill. Вызов j.bump() входит в bump на том же объекте. Тело пишет fill = fill + 1, поэтому fill становится 4. Затем main печатает j.fill, и экран показывает 4.
Если вы напишете bump(); без j. впереди, javac в этой форме main откажет. Методу экземпляра нужен объект. Если вы напишете Jar.bump(); так, будто это static-вызов, это идея следующего урока — не этой страницы. Держите j.bump();.
Сравнение с this и с прямой записью в поле
На странице this вы сохраняли поле внутри конструктора при совпадающих именах. Это по-прежнему работает. Эта страница добавляет метод, который вы можете вызвать позже, когда объект уже существует. Оставшийся демо-пример Tin t = new Tin(7); с this.size = size; — другой урок. Для этой страницы держите Jar, Desk и j.bump();.
Вы всё ещё можете написать j.fill = j.fill + 1; в main. Этот урок переносит это изменение в bump, чтобы объект нёс действие. Печать самого j через System.out.println(j); не показывает чистое 4. Печатайте j.fill, чтобы увидеть сохранённое число.
Два bump на одном jar
Вы можете вызвать j.bump(); дважды перед печатью. Начните с new Jar(3), один bump до 4, второй bump до 5, затем печать. Эта проверка помещается в небольшое второе демо Desk.
public class Desk {
public static void main(String[] args) {
Jar j = new Jar(3);
j.bump();
j.bump();
System.out.println(j.fill);
}
}
Скомпилируйте и запустите снова: javac Jar.java Desk.java, затем java Desk. Экран должен показать 5. Каждый вызов bump выполнялся на том же объекте и добавлял ещё единицу. Запись Jar k = j; не строит второй объект — используйте два вызова new Jar(...), когда нужны два отдельных fill. Для этой страницы двух bump на одном jar достаточно, чтобы увидеть, как метод выполнился дважды.
Если экран всё ещё показывает 3, вызовы bump могут отсутствовать, или main всё ещё печатает до них. Если показывает 7 или другое оставшееся число, в файле может ещё быть старое демо Tin. Держите new Jar(3) и вызовы bump.
Что остаётся для static
Эта страница вызывает метод через объект: j.bump(). Более поздняя страница — static — покажет методы и поля, которые принадлежат самому имени класса без объекта впереди. Здесь оставайтесь с вызовом экземпляра. Не изобретайте на этой странице static void bump(), если вы его ещё не знаете; цель урока — вызов на объекте.
Если javac не находит Jar при компиляции Desk.java, проверьте, что Jar.java лежит в той же папке и что строка класса — public class Jar. Если экран показывает 0, у конструктора может не быть сохранения, или bump никогда не выполняется — держите Jar(int n) { fill = n; } и j.bump(); перед печатью.
Когда в папке ещё лежат Tin.java или Lab.java со страницы this, не трогайте их или удалите только если они путают команду компиляции. После компиляции пары Jar и Desk с этого урока запустите java Desk.
Перед static
Вы можете объявить int fill;, написать Jar(int n) { fill = n; } и void bump() { fill = fill + 1; }, и из Desk выполнить Jar j = new Jar(3);, j.bump();, затем напечатать j.fill. Скомпилируйте оба файла и запустите java Desk. Экран показывает 4. Метод экземпляра выполнился на том объекте и изменил его поле. Следующая страница — static, где некоторые члены принадлежат имени класса без переменной объекта впереди.
Держите void на методе, не на конструкторе. Держите объект перед вызовом: j.bump();. Держите печать на j.fill. Эти три привычки — контрольная точка этой страницы перед тем, как идти дальше.
🧠 Проверьте Свои Знания
Проверьте Свои Знания
Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему
📝 Инструкции
- Внимательно прочитайте каждый вопрос
- Выберите лучший ответ на каждый вопрос
- Вы можете пересдавать тест столько раз, сколько захотите
- Ваш прогресс будет показан вверху