Разберите случай, когда параметр метода и поле объекта имеют одно имя: какое значение получает обращение к имени без квалификатора?
Без квалификатора Java выбирает параметр метода, потому что имя в ближайшей локальной области видимости скрывает поле объекта. Чтобы обратиться именно к полю текущего объекта, используют квалификатор this: this.имя.
Такое разрешение имён поддерживает лексическую область видимости: смысл имени определяется структурой исходного кода, а не тем, откуда фактически вызван метод. Это позволяет использовать понятные имена параметров, совпадающие с именами полей, и явно отделять локальные данные от состояния объекта.
Совпадение имён часто возникает в конструкторах и методах установки состояния. Если не учитывать приоритет областей видимости, можно изменить не поле объекта, а параметр, из-за чего объект останется неинициализированным или сохранит старое значение.
При разрешении простого имени Java ищет его в доступных областях видимости от более близкой к более далёкой. Параметры и локальные переменные метода находятся ближе, чем поля класса, поэтому параметр скрывает поле с тем же именем.
Для доступа к полю текущего экземпляра применяется this. В статическом методе this недоступен, поскольку такой метод не связан с конкретным объектом; поле экземпляра там можно использовать только через ссылку на объект.
В присваивании this.name = name левая часть обозначает поле объекта, а правая — параметр метода. В методе name() локального имени или параметра нет, поэтому неквалифицированное name обозначает поле.
Скрытие имени не меняет область видимости самого поля и не создаёт новое поле. Если одинаковые имена используются в наследовании, правила дополнительно зависят от квалификатора и типа выражения, но простое имя внутри метода сначала разрешается в локальной области.
В конструкторе класса Account параметр id совпадал с полем id, но разработчик написал присваивание без this. В результате параметр присваивался самому себе, а поле оставалось со значением по умолчанию null.
Вариант с разными именами, например accountId, устраняет неоднозначность и повышает читаемость, но может расходиться с принятой в проекте Java-практикой. Вариант с одинаковыми именами и this компактнее и распространён, однако требует дисциплины и проверки левой части присваивания.
Выбранный вариант с this.id = id корректно разделяет поле и параметр, не меняя внешний контракт конструктора. После исправления созданные объекты получают переданный идентификатор, а не значение null.
Нет. Он скрывает поле только при обращении к имени без квалификатора внутри соответствующей области видимости. Доступ через this, ссылку на объект или подходящий квалификатор класса по-прежнему возможен.
Она также будет иметь более близкую область видимости и скроет поле при неквалифицированном обращении. После выхода из внутреннего блока это имя снова может разрешаться как имя внешней переменной или поля, в зависимости от доступных областей.
this в статическом методе для доступа к полю?Нет. this означает текущий экземпляр, а статический метод вызывается без обязательного экземпляра. Для поля экземпляра статическому методу нужна явная ссылка на объект; обращение к статическому полю выполняется через имя класса или допустимый контекст, но это уже не обращение к состоянию конкретного экземпляра.