this有五种核心用途:一是构造方法中用this()调用本类其他构造方法,须为首句;二是用this.区分同名形参与成员变量;三是在lambda或内部类中配合outerclass.this访问外部类字段;四是将当前对象作为参数传递或用于链式调用(return this);五是作为指向当前实例的引用,不可赋值,其tostring()输出类名@哈希码。

在构造方法中用 this() 调用其他构造方法
当一个类有多个构造方法,且存在参数重叠或初始化逻辑相似时,用 this() 复用代码最直接。它必须是构造方法的第一条语句,否则编译报错 Constructor call must be the first statement in a constructor。
-
this()只能调用本类的其他构造方法,不能带super()同时出现 - 不能在普通方法或静态上下文中使用
this() - 递归调用
this()(比如 A 调 B,B 又调 A)会导致编译失败
示例:
public class Person {
private String name;
private int age;
public Person(String name) {
this(name, 0); // 调用三参数构造的简化版
}
public Person(String name, int age) {
this(name, age, "unknown");
}
public Person(String name, int age, String id) {
this.name = name;
this.age = age;
// ... 其他初始化
}
}
用 this.字段名 区分形参与成员变量
这是 this 最常见的用途:当构造方法或 setter 方法的参数名和成员变量名相同时,this.name = name 明确表示“把参数值赋给当前对象的成员变量”。不加 this 也能编译(如果没重名则默认指成员变量),但一旦重名就只能靠 this 消除歧义。
- IDE 自动生成的 setter 常默认写
this.field = field,不是习惯问题,而是安全需要 - 在 lambda 表达式或匿名内部类中访问外部类字段时,
this指的是外部类实例,此时显式写OuterClass.this.field才能避免混淆 - 注意:静态方法里不能用
this,因为this代表具体对象实例,而静态上下文无实例
将当前对象作为参数传给其他方法
当需要把“自己”交给别的类或方法处理时,比如注册回调、加入集合、委托操作,this 就是那个不可替代的引用。
- 常见于事件监听器注册:
button.addActionListener(this)(前提是当前类实现了ActionListener) - 用于链式调用(Builder 模式):
return this;让方法返回当前对象,支持连续调用 - 传递
this到新线程需谨慎:若对象尚未初始化完成就被其他线程访问,可能引发竞态或NullPointerException
示例(链式调用):
public class Builder {
private String name;
private int size;
public Builder setName(String name) {
this.name = name;
return this; // 返回当前实例,支持 .setName().setSize()
}
public Builder setSize(int size) {
this.size = size;
return this;
}
}
this 不是对象本身,而是指向当前对象的引用
很多人误以为 this 是对象的“副本”或“地址”,其实它就是一个隐式传入的引用变量,类型就是当前类。它和局部变量一样,存储在栈上,指向堆中的实际对象。
立即学习“Java免费学习笔记(深入)”;
- 对
this重新赋值(如this = new X())语法非法,Java 不允许修改this的指向 - 打印
this.toString()或直接System.out.println(this)输出的是类名@哈希码,这个哈希码默认来自Object.hashCode(),不是内存地址 - 序列化、远程调用(RMI)、某些框架(如 Spring AOP)代理对象时,
this在被代理方法内部可能指向代理对象而非原始实例——这点极易被忽略
真正容易出问题的地方不在语法,而在多线程、代理、序列化这些上下文中对 this 生命周期和身份的误判。









