this关键字代表当前对象引用,可用于传参给本类或其他类方法、构造器及回调接口,但需防范未初始化暴露和内存泄漏风险。

在 Java 中,this 关键字代表当前对象的引用,可以直接用它把“自己”传给其他方法——无论是本类中的方法、其他类的方法,还是构造器、回调接口等场景。
在本类中将 this 传给另一个方法
这是最常见也最直接的用法。只要目标方法参数类型是当前类(或其父类/接口),就能传 this:
- 适用于需要复用逻辑、解耦职责或实现链式调用的场景
- 注意避免在构造器中过早暴露未初始化完成的
this(比如传给外部线程或静态集合)
示例:
class Person {private String name;
public Person(String name) {
this.name = name;
registerSelf(); // 构造中传 this
}
private void registerSelf() {
Registry.add(this); // 把当前实例注册到某个管理器
}
public void introduceTo(Person other) {
other.greet(this); // 把自己传给对方的 greet 方法
}
public void greet(Person visitor) {
System.out.println("Hello, " + visitor.name + "! I'm " + this.name);
}
}
将 this 传给其他类的方法(如监听器、策略、工厂)
当需要让外部对象持有或操作当前对象时,常通过 this 实现回调或委托:
- 适合事件驱动模型(如 GUI 监听、网络回调)
- 务必确认接收方不会长期强引用
this导致内存泄漏(尤其在 Android 或长生命周期组件中) - 可配合弱引用(
WeakReference)或接口抽象来降低耦合
示例:
class Button {private OnClickListener listener;
public void setOnClickListener(OnClickListener listener) {
this.listener = listener;
}
public void click() {
if (listener != null) listener.onClick(this); // 把 button 自身传过去
}
}
interface OnClickListener {
void onClick(Button button);
}
// 使用时:
Button btn = new Button();
btn.setOnClickListener(new OnClickListener() {
public void onClick(Button b) {
System.out.println("Clicked: " + b); // b 就是 btn 本身
}
});
在构造器中传递 this 的注意事项
虽然语法允许,但需格外谨慎:
- 此时对象可能尚未完全初始化(字段为默认值、初始化块未执行),若外部方法立即访问成员变量,结果不可预期
- 禁止将
this发布到静态字段、线程、监听器列表等“逃逸”作用域 - 推荐做法:构造完成后再调用注册/绑定类方法
结合函数式接口或 Lambda 简化 this 传递
Java 8+ 可用方法引用更简洁地表达“以当前对象为参数调用某方法”:
-
someList.forEach(this::processItem)等价于someList.forEach(item -> this.processItem(item)) - 本质仍是隐式使用
this,但无需显式写出,代码更清晰 - 注意 lambda 捕获的是
this引用,不是副本,修改成员仍会影响原对象
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











