Java中this是编译器隐式传入的当前对象引用,作为非静态方法的第一个参数参与调用;源码中显式使用可区分同名变量、传递当前对象或支持链式调用;this()是构造器专用语法糖,与隐式this无关;内部类中Outer.this用于显式访问外部类实例。

Java 中的 this 不是“写出来才有”的变量,而是编译器在每次调用非静态方法时,自动把当前对象引用塞进方法参数列表的第一个位置——它真实参与调用过程,只是你没在源码里声明。
隐式传递:JVM 层面的真实参数
当你写 d.setYear(2023),JVM 实际执行的逻辑等价于:setYear(d, 2023)。这个 d 就是 this,被编译器悄悄放在字节码方法签名的第 0 号局部变量槽中。
- 每个非静态方法在字节码里都有一个隐式的第一个参数,类型就是该类本身
- 方法体内所有对成员变量(如
year)或实例方法(如getName())的访问,底层都通过这个隐式参数完成寻址 - 静态方法没有 this,因为 JVM 栈帧里根本没预留这个槽位;一旦在 static 方法里写 this,编译直接报错,不等到运行时
显式调用:代码中能看见的三种典型用法
虽然 this 是隐式传入的,但在源码中我们常主动写出它,来表达明确意图:
-
区分同名变量:形参叫
name,成员变量也叫name,必须写this.name = name才能把值赋给对象字段 -
传递当前对象:比如
registry.register(this)或listener.onEvent(this),把整个实例作为参数交给外部逻辑 -
链式调用基础:每个方法末尾写
return this;,让下一次调用仍以同一个对象为隐式参数继续执行,如user.setEmail("a@b.com").activate().save()
特别注意:this() 不是 this 的用法
this() 看起来像用了 this,但它和隐式参数 this 完全无关:
立即学习“Java免费学习笔记(深入)”;
- 它是编译器识别的构造器专用语法糖,只允许出现在构造方法第一行
- 作用是跳转到本类另一个构造器,本质是构造链指令,不经过普通方法调用机制
- 不能在普通方法里写
this(),也不能和super()共存,因为两者都要抢占第一行位置
内部类里的 Outer.this 是显式解引用
在非静态内部类中,编译器会悄悄给内部类加一个指向外部类实例的合成字段(如 this$0),而 Outer.this 是你手动写的、带类型限定的访问方式:
- 它不是隐式参数,也不是语法糖,是你主动解引用编译器生成的隐藏引用
- 不写
Outer.this,内部类依然持有外部实例;但想在代码里拿到它,就必须这么写 - 这和普通方法里的
this可省略不同——这里省略就编译不过


















