目录

this 是什么

this 表示当前对象,只能出现在实例上下文中。

它最常见的用途有四个:区分同名的成员变量与参数、调用本类其他构造方法、传递当前对象、返回当前对象实现链式调用。

区分成员变量与参数

当构造方法或 setter 的参数与成员变量同名时,参数会遮蔽成员变量。this.name 表示当前对象的成员变量,name 表示方法参数。

class User {
    private String name;

    User(String name) {
        this.name = name;
    }

    void setName(String name) {
        this.name = name;
    }
}

如果写成 name = name,只是将参数赋值给自己,成员变量不会被修改。

调用本类其他构造方法

this(...) 用于调用同一个类中的其他构造方法,常用来集中复用初始化逻辑。

class User {
    private final String name;
    private final int age;

    User(String name) {
        this(name, 0);
    }

    User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

[!yellow]
Java 24 及之前,this(...) 必须是构造方法的第一条语句。Java 25 开始支持灵活构造方法体,可以在它之前执行不访问当前对象的语句。面试时应先确认 Java 版本。

传递当前对象

this 可以作为普通对象引用传给其他方法或构造方法,常见于回调注册和对象关联。

class ListenerRegistry {
    void register(Listener listener) {
    }
}

class Listener {
    Listener(ListenerRegistry registry) {
        registry.register(this);
    }
}

返回当前对象

实例方法返回 this,调用方就可以继续操作同一个对象,这是链式调用的基础。

class Builder {
    private String value;

    Builder value(String value) {
        this.value = value;
        return this;
    }

    Builder print() {
        System.out.println(value);
        return this;
    }
}

new Builder().value("Java").print();

this 面试考点

  • this 表示当前对象,不能在 static 方法或静态代码块中使用。
  • 调用本类实例变量或实例方法时,this. 通常可以省略;发生同名遮蔽时不能省略。
  • this(...) 只能出现在构造方法中,用于调用本类的其他构造方法。
  • 构造方法之间不能通过 this(...) 形成直接或间接的循环调用。
  • this 是关键字表达式,不是可重新赋值的变量,this = other 会编译失败。

this 与 super 的区别

对比项 this super
表示对象 当前对象 当前对象的父类部分
访问成员 当前类的实例字段和方法 父类中被遮蔽的字段或被重写的方法
构造调用 this(...),调用本类其他构造方法 super(...),调用父类构造方法

参考资料