Ключевое слово this в Java - Вопросы
Всего: 4 вопросов
1. Что такое ключевое слово this в Java и где оно доступно?
Что такое ключевое слово this в Java и где оно доступно?
this — это ссылка на текущий объект, то есть на тот экземпляр класса, у которого сейчас выполняется метод или конструктор. Внутри любого нестатического метода this доступно автоматически: компилятор передаёт ссылку неявно, поэтому обращение width — сокращённая запись this.width. В static-методе, статическом блоке инициализации и в main ключевого слова this нет: объекта не существует, и компилятор выдаст ошибку non-static variable this cannot be referenced from a static context.
2. Зачем нужен this, если параметр конструктора или сеттера назван так же, как поле класса?
Зачем нужен this, если параметр конструктора или сеттера назван так же, как поле класса?
Параметр затеняет (перекрывает) поле: внутри такого метода простое имя width относится к параметру, а не к полю объекта. Чтобы добраться до поля, пишут this.width = width; — слева поле, справа параметр. Если забыть this и написать width = width;, код скомпилируется, но присвоит параметр самому себе, и поле останется равным значению по умолчанию (0.0 для double). Ошибка проявится только во время выполнения. Когда параметры названы по-другому (w, h, d), затенения нет и this не обязателен.
3. Что делает вызов this(...) и какие правила действуют для цепочки конструкторов?
Что делает вызов this(...) и какие правила действуют для цепочки конструкторов?
this(...) вызывает другой конструктор этого же класса — приём против дублирования кода: вся логика инициализации живёт в одном «главном» конструкторе, а остальные подставляют значения по умолчанию и делегируют работу ему. Это называют цепочкой конструкторов (constructor chaining). Правила: вызов this(...) должен быть первой инструкцией конструктора; нельзя в одном конструкторе одновременно вызвать this(...) и super(...); цепочка не может замкнуться (компилятор сообщит recursive constructor invocation); из обычного метода конструктор вызвать нельзя. С Java 25 гибкие тела конструкторов (JEP 513) допускают инструкции пролога до this(...), если они не обращаются к создаваемому экземпляру.
4. Где, кроме разрешения конфликта имён, ещё применяют this?
Где, кроме разрешения конфликта имён, ещё применяют this?
this используют, чтобы передать сам объект в другой метод, например зарегистрировать его в другом классе (bus.subscribe(this)), и чтобы вернуть текущий объект из метода (return this;) — на этом построены билдеры и «текучие» (fluent) API, где вызовы объединяются в цепочку. Внутри лямбда-выражения this указывает на объект внешнего класса, в котором лямбда объявлена, потому что своего this у лямбды нет; у анонимного класса поведение другое — там this ссылается на сам экземпляр анонимного класса.