Ключевое слово this в Java - Вопросы

Всего: 4 вопросов

1. 

Что такое ключевое слово this в Java и где оно доступно?

this — это ссылка на текущий объект, то есть на тот экземпляр класса, у которого сейчас выполняется метод или конструктор. Внутри любого нестатического метода this доступно автоматически: компилятор передаёт ссылку неявно, поэтому обращение width — сокращённая запись this.width. В static-методе, статическом блоке инициализации и в main ключевого слова this нет: объекта не существует, и компилятор выдаст ошибку non-static variable this cannot be referenced from a static context.

2. 

Зачем нужен this, если параметр конструктора или сеттера назван так же, как поле класса?

Параметр затеняет (перекрывает) поле: внутри такого метода простое имя width относится к параметру, а не к полю объекта. Чтобы добраться до поля, пишут this.width = width; — слева поле, справа параметр. Если забыть this и написать width = width;, код скомпилируется, но присвоит параметр самому себе, и поле останется равным значению по умолчанию (0.0 для double). Ошибка проявится только во время выполнения. Когда параметры названы по-другому (w, h, d), затенения нет и this не обязателен.

3. 

Что делает вызов this(...) и какие правила действуют для цепочки конструкторов?

this(...) вызывает другой конструктор этого же класса — приём против дублирования кода: вся логика инициализации живёт в одном «главном» конструкторе, а остальные подставляют значения по умолчанию и делегируют работу ему. Это называют цепочкой конструкторов (constructor chaining). Правила: вызов this(...) должен быть первой инструкцией конструктора; нельзя в одном конструкторе одновременно вызвать this(...) и super(...); цепочка не может замкнуться (компилятор сообщит recursive constructor invocation); из обычного метода конструктор вызвать нельзя. С Java 25 гибкие тела конструкторов (JEP 513) допускают инструкции пролога до this(...), если они не обращаются к создаваемому экземпляру.

4. 

Где, кроме разрешения конфликта имён, ещё применяют this?

this используют, чтобы передать сам объект в другой метод, например зарегистрировать его в другом классе (bus.subscribe(this)), и чтобы вернуть текущий объект из метода (return this;) — на этом построены билдеры и «текучие» (fluent) API, где вызовы объединяются в цепочку. Внутри лямбда-выражения this указывает на объект внешнего класса, в котором лямбда объявлена, потому что своего this у лямбды нет; у анонимного класса поведение другое — там this ссылается на сам экземпляр анонимного класса.

Страница 1 из 1