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