Java 面向对象核心入门(六):this 关键字完全解析

「 Java 面向对象系列 06 」

📖 上篇回顾Java 面向对象核心入门(五):构造方法详解「创建对象时直接给属性赋值」-CSDN博客
上一篇写构造方法的时候,我们反复见到 this.name = name;,很多新手在这里很迷惑:this 到底是什么?为什么要写它?不写行不行?本篇一次性讲透 this 的 3 种用法。

一、this 到底是谁

Java虚拟机会给每个对象分配this,代表当前对象。

通俗比喻: this 代表当前正在操作的那个对象,相当于对象自身的 "自我代词"。 就好比现实里的 "我",谁在做事,this 就指代谁。

this小结:简单的说,哪个对象调用,this就代表哪个对象

注意:this 只能用在方法 / 构造方法内部,静态方法中不能使用 this。

二、用法 1:「this. 成员变量」解决局部变量和属性重名(最常用)

看下面这段容易出错的代码:

java 复制代码
class Student{
    private String name;
    private int age;

    //有参构造
    public Student(String name,int age){
        name = name;
        age = age;
    }

    public String getName() {
        return name;
    }
}

运行测试:

java 复制代码
Student stu = new Student("张三",18);
System.out.println(stu.getName());

输出:null

问题在哪?

方法括号里的 name局部变量name = name,是局部变量给自己赋值,并没有给对象的成员变量赋值。程序分不清谁是谁。

✅ 正确写法,加上 this.

java 复制代码
public Student(String name,int age){
    this.name = name; // this.name:对象的成员变量;等号右边name:传入的参数
    this.age = age;
}
  • this.name对象的成员属性
  • 不带 this 的name:方法的局部变量 / 参数

局部变量和成员变量重名,必须加 this;名字不一样,可以省略 this

setter 方法里同样大量使用 this:

java 复制代码
public void setName(String name){
    this.name = name;
}

三、用法 2:「this. 成员方法」调用本类中的其他方法

在同一个类里面,可以使用 this.方法名() 调用本类其他普通方法。 this. 大多数场景可以省略,写出来可读性更强。

java 复制代码
class Student{
    private String name;

    public void study(){
        System.out.println(name+"正在学习");
    }

    public void showInfo(){
        System.out.println("学生信息展示");
        this.study(); //调用本类study()方法,this.可以删掉
    }
}

四、用法 3:this (参数列表) 调用本类其他构造方法

this(参数列表),专门用于一个构造方法调用本类另一个构造方法。(仅限构造方法)

硬性语法规则

  1. this() 必须是构造方法中第一条可执行语句,前面只能有注释或空行,否则编译报错。
  2. 不能互相循环调用(A 构造调 B,B 又调 A,会死循环报错)
  3. 普通方法不能写 this ()

示例代码

java 复制代码
class Student{
    private String name;
    private int age;

    //无参构造
    public Student(){
        System.out.println("无参构造执行");
    }

    //单参构造
    public Student(String name){
        this(); //调用本类无参构造,必须放在第一行
        this.name = name;
    }

    //双参构造
    public Student(String name,int age){
        this(name); //调用上面单参构造
        this.age = age;
    }

    //getter、setter省略
}

测试代码

java 复制代码
Student stu = new Student("李四",20);

执行顺序:双参构造 → this (name) 调用单参构造 → this () 调用无参构造。

使用场景:多个构造方法存在重复初始化代码,用 this () 复用代码,减少重复书写。

五、this 不能用在哪里?

static 静态方法里面,绝对不能写 this!

java 复制代码
public static void test(){
    this.name = "abc"; //编译直接报错
}

原因:static 属于类,直接类名调用,此时不一定存在对象;而 this 必须依附一个实实在在的对象。

六、完整综合案例

java 复制代码
class Student {
    private String name;
    private int age;

    // 无参构造
    public Student() {
        System.out.println("调用了无参构造");
    }

    // 单参构造
    public Student(String name) {
        this();              // 调用无参构造
        this.name = name;
        System.out.println("调用了单参构造");
    }

    // 双参构造,复用其他构造
    public Student(String name, int age) {
        this(name);          // 调用单参构造
        this.age = age;
        System.out.println("调用了双参构造");
    }

    // setter
    public void setName(String name) {
        this.name = name;
    }
    public void setAge(int age) {
        this.age = age;
    }

    // getter
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }

    // 普通方法
    public void show() {
        System.out.println("姓名:" + this.name + ",年龄:" + this.age);
    }
}

public class TestThis {
    public static void main(String[] args) {
        System.out.println("===== 方式一:使用双参构造 =====");
        Student s1 = new Student("张三", 18);
        s1.show();

        System.out.println("\n===== 方式二:无参构造 + setter =====");
        Student s2 = new Student();
        s2.setName("小明");
        s2.setAge(19);
        s2.show();
    }
}

输出:

复制代码
===== 方式一:使用双参构造 =====
调用了无参构造
调用了单参构造
调用了双参构造
姓名:张三,年龄:18

===== 方式二:无参构造 + setter =====
调用了无参构造
姓名:小明,年龄:19

输出分析:

使用双参构造 new Student("张三", 18) 时,由于构造方法之间通过 this() 链式调用,执行顺序为:

  1. 双参构造 → this(name) → 单参构造
  2. 单参构造 → this() → 无参构造
  3. 无参构造执行完毕,回到单参构造继续执行 this.name = name
  4. 单参构造执行完毕,回到双参构造继续执行 this.age = age

所以控制台先打印"无参构造",再打印"单参构造",最后打印"双参构造"。

七、全文核心小结

  1. this 代表当前对象本身,只能存在对象方法 / 构造方法中。
  2. this.变量名:区分成员变量与局部变量重名,开发最常用。
  3. this.方法名():调用本类普通方法,this 可以省略。
  4. this(参数):调用本类其他构造方法;必须是构造方法中第一条可执行语句,不能循环调用。
  5. static 静态方法,禁止使用 this。

🚀建议自己动手敲一遍综合案例,观察 this() 的调用顺序。

相关推荐
萧瑟余晖16 分钟前
Java深入解析篇九之JavaStream API详解
java
淬炼之火19 分钟前
笔记:Visually-Guided Policy Optimization for Multimodal Reasoning
人工智能·笔记·算法·机器学习·语言模型·自然语言处理
一只QAQ21 分钟前
c++项目
java·c++·算法
小蒜学长28 分钟前
基于SpringBoot + Vue的智能健身房管理系统的设计与实现(代码+数据库+LW)
java·数据库·vue.js·spring boot·后端
DolitD29 分钟前
云流技术深度剖析:单服务器下如何实现3D应用的多实例并发?
java·服务器·前端·3d·云原生·云计算
jun_bai34 分钟前
Ecplise中发布项目到配置的tomcat中
java·服务器
liangbo734 分钟前
JVM规范第 6 章:Java 虚拟机指令集
java·jvm
一条破秋裤35 分钟前
STM32 学习笔记:中断系统与 EXTI 外部中断
笔记·stm32·学习
南城以南溫暖如初14739 分钟前
AI 智能商城 APP 定制开发的核心需求
java·人工智能·spring boot·mysql·mybatis·需求分析