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, Зачем нужны конструкторы абстрактным классам.