this用于解决成员变量与参数名冲突、调用本类其他构造方法、传递当前对象引用、访问外部类成员;在Lambda中指向外部类,匿名类中指向自身实例。

区分成员变量和参数名冲突时用 this
当构造方法或普通方法的参数名和成员变量同名,JVM 无法自动识别你要赋值给谁,必须显式用 this 指向当前对象的成员变量。
- 不加
this会导致赋值失败(实际是给参数自己赋值) - 常见于构造方法初始化、
setter方法中 - IDE(如 IntelliJ)常自动补全
this.提示,但不是必须的语法要求
public class Person {
private String name;
public Person(String name) {
this.name = name; // 必须用 this.name,否则 name = name 是参数自赋值
}
}
在构造方法中调用本类其他构造方法用 this(...)
this(...) 必须是构造方法的第一条语句,用于复用初始化逻辑,避免重复代码。不能和 super(...) 同时出现。
- 只能在构造方法内部使用,且只能调用一次
- 参数类型和数量必须匹配目标构造方法签名
- 若没写任何构造方法,编译器默认提供无参构造;一旦定义了带参构造,无参构造就不再自动提供
public class Point {
private int x, y;
public Point() {
this(0, 0); // 调用下面的构造方法
}
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
将当前对象作为参数传递给其他方法时用 this
当需要把“自己”作为参数传给另一个对象的方法(比如注册监听器、回调、链式调用),就得用 this 显式传递引用。
- 常见于事件注册:
button.addActionListener(this)(实现ActionListener接口时) - 链式调用中返回
this实现 fluent interface,如builder.setName("a").setAge(18).build() - 注意:传的是引用,不是副本;修改该引用指向的对象会影响原对象
public class Counter {
private int value = 0;
public Counter increment() {
value++;
return this; // 支持链式调用
}
}
内部类访问外部类成员时用 OuterClass.this
非静态内部类(inner class)隐式持有外部类实例引用,但当内部类也有同名成员时,需用 OuterClass.this.field 明确指定访问外部类字段。
立即学习“Java免费学习笔记(深入)”;
- 仅限非静态内部类;静态嵌套类(
static class)不持有外部类引用,不能用OuterClass.this - 编译器不会报错,但可能意外访问到内部类自己的字段,导致逻辑错误
- IDE 通常会警告“ambiguous field access”,此时应主动补全限定符
public class Outer {
private String data = "outer";
class Inner {
private String data = "inner";
void print() {
System.out.println(Outer.this.data); // 输出 "outer"
System.out.println(this.data); // 输出 "inner"
}
}
}
真正容易出问题的不是 this 的语法,而是它在多层嵌套、匿名内部类、Lambda 表达式中的隐式行为——比如 Lambda 中的 this 指向外部类,而匿名类里的 this 指向自身实例,这种差异在回调场景下极易引发空指针或状态错乱。










