this关键字
Java中的this关键字的核心含义
this 关键字的本质是 JVM 为非静态上下文隐式提供的、指向当前关联类实例的只读引用
简单来说 this 是 Java 的一个引用变量,仅指向当前执行非静态代码的实例对象
this 和 static 不能出现在一起的,static 关键字是对类而言的,而 this 关键字是指当前对象,因此 staic 修饰的方法中不能使用 this。
this 不能单独使用,this 必须后跟成员变量、方法或构造方法,下面具体介绍。
访问当前对象的成员变量
this.实例变量名
在 Java 中,当实例方法、构造方法的局部变量(包括形式参数)与所属类的实例变量(非 static 成员变量) 标识符同名时,依据 Java 标识符解析的就近原则,代码中直接使用该标识符会优先绑定到作用域更近的局部变量(形式参数属于方法级局部作用域),而非当前实例的实例变量。此时若需访问当前实例的同名实例变量,必须通过 this.实例变量名 的语法显式指定,以消解标识符命名冲突,确保程序访问的是目标变量;若未使用this,则会因标识符解析优先级导致程序错误地引用局部变量,进而引发逻辑错误。
java
public class Demo {
private String name;
private int age;
private String sex;
public Demo(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
}
class Test{
public static void main(String[] args) {
Demo demo = new Demo("张三", 18, "男");
Demo demo1 = new Demo("李四", 20, "男");
}
}
在 Demo 类中,构造方法的形式参数(局部变量)与类的实例变量(非 static 成员变量)标识符(name、age、sex)完全同名。依据 Java 标识符解析的就近原则,构造方法内直接使用这些标识符时,会优先绑定到作用域更近的局部变量(构造方法参数),而非当前正在创建的Demo实例的成员变量;若省略this关键字直接执行 name = name 这类赋值操作,本质是将局部变量赋值给自身,实例变量会保留默认初始值(name/sex为null、age为0),无法实现用参数初始化实例变量的核心逻辑。
代码中 this.name = name、this.age = age、this.sex = sex 的写法,通过this关键字显式消解了命名冲突:this作为当前实例的专属引用,指向堆内存中正在初始化的 Demo 实例,this.成员变量名 的语法精准限定访问的是该实例的对应成员变量,等号右侧的变量名则遵循就近原则指向构造方法的参数,最终实现将构造方法参数值赋值给当前实例成员变量的目标。
在创建 demo 和 demo1 两个实例时,每个实例初始化过程中 this 的指向唯一且独立,创建 demo 时 this 指向该实例,完成 "张三""18""男" 的赋值;创建 demo1 时 this 指向新的实例,完成 "李四""20""男" 的赋值,确保不同实例的成员变量被精准初始化且互不干扰。
调用当前对象的成员方法
this.方法
省略 this 时,编译器会自动在成员方法调用前补全 this.,因此 this.方法名() 和 方法名() 在功能上等价,但 this 让语义更清晰
java
public class Demo {
private String name;
private int age;
private String sex;
public Demo(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
this.printInfo();
}
public void printInfo() {
System.out.println("姓名:" + this.name + ",年龄:" + this.age + ",性别:" + this.sex);
}
public void updateAge(int newAge) {
this.age = newAge;
this.printInfo();
}
public static void main(String[] args) {
Demo demo = new Demo("张三", 18, "男");
demo.updateAge(20);
}
}
this.printInfo() 中,this 指向发起调用的 Demo 实例(demo对象);
构造方法中 this.printInfo() 的 this,指向正在创建的 Demo 实例;
省略 this 直接写 printInfo(),编译器会自动解析为 this.printInfo(),本质完全一致。
调用当前类的构造方法
this(...)
this(...) 是 Java 构造方法内的特殊语法,用于显式调用当前类的另一个重载构造方法。其核心价值是复用构造方法的初始化逻辑,减少代码冗余,同时保证实例初始化逻辑的一致性,实现代码复用。
this() 的使用有严格的语法限制,违反任一规则都会直接编译报错:
this() 必须是构造方法的第一条语句,任何代码出现在 this() 前都会报错;
this() 的参数列表必须与当前类中另一个构造方法的参数列表完全匹配(参数类型、数量、顺序一致);
一个构造方法中只能调用一次this();
this() 不能与super()(调用父类构造方法)同时使用(两者都要求是构造方法第一条语句);
this() 仅能在构造方法内使用,不能在实例方法、静态方法、静态代码块中使用;
this() 调用的构造方法访问修饰符不影响(哪怕目标构造方法是private,当前类内部也可调用)。
this() 调用当前类的构造方法时,目标构造方法的访问修饰符不会产生限制(哪怕目标构造方法是private,当前类内部的其他构造方法也能通过this()调用它)。
java
public class Demo {
private String name;
private int age;
private String sex;
// 场景1:无参构造 → 调用三参构造
public Demo() {
this("未知姓名", 0, "未知性别");
System.out.println("无参构造执行(复用三参构造逻辑)");
}
// 场景2:单参构造 → 调用三参构造
public Demo(String name) {
this(name, 0, "未知性别");
System.out.println("单参构造执行(复用三参构造逻辑)");
}
// 场景3:双参构造 → 调用三参构造
public Demo(String name, int age) {
this(name, age, "未知性别");
System.out.println("双参构造执行(复用三参构造逻辑)");
}
// 场景4:三参构造
public Demo(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
System.out.println("三参构造执行(核心初始化)");
}
public void printInfo() {
System.out.println("最终初始化结果:" + name + "," + age + "," + sex);
}
public static void main(String[] args) {
System.out.println("=== 创建无参实例 ===");
Demo demo1 = new Demo();
demo1.printInfo();
System.out.println("\n=== 创建单参实例 ===");
Demo demo2 = new Demo("张三");
demo2.printInfo();
System.out.println("\n=== 创建双参实例 ===");
Demo demo3 = new Demo("李四", 20);
demo3.printInfo();
}
}
执行结果:

关键执行流程(以无参构造为例):
执行 new Demo() 时,JVM 先创建空的 Demo 实例,进入无参构造;
无参构造第一条语句是 this("未知姓名", 0, "未知性别"),JVM 立即跳转到三参构造执行;
三参构造完成 this.name/age/sex的赋值,打印 "三参构造执行";
三参构造执行完毕后,回到无参构造,执行后续的 System.out.println;
最终无参构造执行完毕,实例初始化完成。