this

this — ссылка на текущий экземпляр. Она доступна в конструкторе, экземплярном методе и нестатическом блоке инициализации.

final class Point {
    private final int x;
    private final int y;
 
    Point(int x, int y) {
        this.x = x; // отличаем поле от параметра
        this.y = y;
    }
 
    Point(int value) {
        this(value, value); // делегирование другому конструктору
    }
 
    Point moveX(int delta) {
        return new Point(this.x + delta, y);
    }
}

Варианты использования

  • this.field — обратиться к полю текущего объекта;
  • this.method() — вызвать его экземплярный метод;
  • this(...) — вызвать другой конструктор этого же класса;
  • передать текущий объект как аргумент;
  • вернуть текущий объект в fluent API.

this(...) обязан быть первым оператором конструктора. В одном конструкторе нельзя одновременно вызвать this(...) и super(...): цепочка в итоге сама дойдёт до конструктора родителя.

Важное различие

В лямбде this относится к окружающему объекту. В анонимном классе — к экземпляру анонимного класса.

class Worker {
    Runnable lambda = () -> System.out.println(this.getClass());
    Runnable anonymous = new Runnable() {
        public void run() {
            System.out.println(this.getClass());
        }
    };
}

Не стоит публиковать this из конструктора в коллекцию, callback или новый поток: другой код может увидеть частично построенный объект.

На собеседовании

Есть ли this в статическом методе? Нет: вызов не связан с экземпляром.

Можно ли вызвать this() не первой строкой? Нет.

Что означает this внутри лямбды? Текущий экземпляр окружающего класса.

Зачем писать this.field, если конфликта имён нет? Это вопрос стиля; семантически обычно не требуется.

Связано: super java, Зачем нужны конструкторы абстрактным классам.