Ключевое слово this
ВведеноПараметр может скрыть поле, которое он должен обновить
- У объекта имя "Ada". Вызов setName(String name) выполняет присваивание name = name; с аргументом "Bo".
- Оба некачественных имени ссылаются на параметр, поэтому у объекта остается "Ada". Присваивание this.name = name устанавливает значение параметра в поле вместо этого.
"Этот объект"
- Внутри экземплярного метода
thisссылается на объект, для которого был вызван метод.student.addScore(10)выполняется сthis= этотstudent. this.scoreозначает «scoreобъекта, с которым я работаю». Это позволяет методу явно обращаться к своему объекту.
Различение поля и параметра
- Основное применение: отличить экземплярную переменную от параметра с тем же именем.
void setName(String name) { this.name = name; } this.name— это экземплярная переменная; обычныйname— это параметр. Это стандартное исправление ошибки затемнения из 3.8.
Доступ к объекту-получателю
thisпредоставляет метод указатель на точный объект, для которого он был вызван. Каждый экземплярный метод имеет неявныйthis, независимо от того, пишете ли вы его или нет.- Когда score обозначает незазатененное поле экземпляра,
score += s;используетthis.score. Если параметр или локальная переменная с именем score затеняет её, неограниченное имя вместо этого ссылается на эту переменную. Вы записываетеthisявно только при необходимости (например, при разрешении затемнения).
this указывает на объект-приемник
Внутри setName, this — это объект ada, для которого был вызван метод.
Внутри инстансного метода this ссылается на...
Сложность 1/5 · 100 монет + небольшой бонус за первое выполнение сегодня
this — это указатель на текущий объект.
В setName(String name) { this.name = name; }, this.name — это...
Сложность 1/5 · 100 монет + небольшой бонус за первое выполнение сегодня
this.name — это поле; plain name — это параметр.
Ключевое слово this можно использовать внутри статического метода.
Сложность 1/5 · 100 монет + небольшой бонус за первое выполнение сегодня
У статических методов нет конкретного объекта, поэтому нет и this.
Что делает запись name = name; (без this) внутри setName(String name)?
Сложность 1/5 · 100 монет + небольшой бонус за первое выполнение сегодня
Оба имени являются параметром; используйте this.name для доступа к полю.
У каждого инстансного метода есть неявный this, независимо от того, пишете вы его или нет.
Сложность 1/5 · 100 монет + небольшой бонус за первое выполнение сегодня
Экземплярный метод имеет текущего получателя. Некачественное имя score ссылается на this.score только если нет параметров или локальных переменных, скрывающих это поле.
Нет this в статическом методе
- Статический метод не имеет
this— он не привязан ни к какому конкретному объекту. Поэтому статический метод не может использоватьthisили неограниченное поле экземпляра, но может читать поле экземпляра через явную ссылку, если разрешения доступа это позволяют. - Попытка использовать
thisв статическом методе вызывает ошибку компиляции. Если вам нуженthis, метод должен быть экземплярным, а не статическим.
Используйте this.field = param; для устранения затенения — this.name является переменной экземпляра, обычный name — это параметр. Запись name = name; (без this) просто присваивает параметр самому себе. И this не существует в статическом методе — у статического метода нет конкретного объекта, поэтому использование this там не скомпилируется.
Type the field value after the faulty setName("Bo") call on the described object.
Сложность 1/5 · 100 монет + небольшой бонус за первое выполнение сегодня
The parameter assigns to itself; the field is unchanged until this.name is used on the left.
Если alias и a ссылаются на одного и того же Student, то вызов alias.setName("Di") изменит имя, которое позже будет прочитано через a.
Сложность 1/5 · 100 монет + небольшой бонус за первое выполнение сегодня
Обе ссылки указывают на один и тот же объект-получатель, поле которого обновляется.
Код объекта b вызывает a.setName("Cy"). Внутри метода setName какой объект является this?
Сложность 1/5 · 100 монет + небольшой бонус за первое выполнение сегодня
Получатель a предоставляет значение this, независимо от того, чей код другого объекта инициировал вызов.
Исправление ошибки затенения с помощью this:
- Переменная экземпляра
private String name; void setName(String name) { this.name = name; }— правильно!this.name(поле) получает значениеname(параметра).
Перенесите рассуждения на новый случай
- Отслеживайте a и b как отдельно созданных студентов по именам Ада и Бо.
a.setName("Cy")изменяет a на Cy, тогда как b остаётся Bo. Если alias=a,alias.setName("Di")изменяет тот же первый объект, поэтому a теперь читает Di. - Получатель — это объект, с которым работает экземплярный метод, а не обязательно объект, чей код его вызвал. Статический метод может действовать на явную ссылку на объект, но не имеет неявного this.
this относится к текущему объекту — тому, для которого был вызван метод экземпляра. Его ключевое применение — разрешение затенения: this.name = name; присваивает параметру переменную экземпляра. У каждого метода экземпляра есть неявный this, но у статического метода его нет, поэтому this не может быть использован там.