杰瑞科技汇

this在Java中到底该怎么用?

this 是 Java 中的一个保留关键字,它是一个指向当前对象的引用,你可以把它理解为“当前这个对象”的代名词,它的主要用途是在类内部,让你能够明确地引用当前对象的成员(变量和方法)。

this在Java中到底该怎么用?-图1
(图片来源网络,侵删)

this 的核心用途可以归结为以下三大类:


解决成员变量与局部变量的命名冲突

这是 this 最常见、最重要的用法,当方法的参数名与类的成员变量名相同时,Java 编译器会默认使用参数名,如果你想在这个方法内部访问或操作类的成员变量,就必须使用 this 关键字来明确指定。

示例:

public class Person {
    private String name; // 成员变量
    // 构造方法,参数名也是 name
    public Person(String name) {
        // 这里的 name 指的是构造方法的参数 name
        // 如果我们不使用 this,name = name; 就没有任何意义,相当于自己给自己赋值。
        // 使用 this.name 表示给当前对象的成员变量 name 赋值
        this.name = name;
    }
    public void printName() {
        System.out.println("Name: " + this.name); // 这里使用 this 可以省略,但加上更清晰
    }
}
public class Main {
    public static void main(String[] args) {
        Person person = new Person("Alice");
        person.printName(); // 输出: Name: Alice
    }
}

分析:Person(String name) 构造方法中:

this在Java中到底该怎么用?-图2
(图片来源网络,侵删)
  • name(没有 this 的)指的是方法的参数
  • this.name 指的是当前创建的这个 Person 对象的成员变量

通过 this.name = name;,我们将传入的参数 name 的值赋给了当前对象的成员变量 name


在构造方法中调用其他构造方法

在一个类中,你可以使用 this(...) 的形式来调用同一个类中的其他构造方法,这通常被称为构造方法重载,这样做可以避免重复的代码,使构造逻辑更清晰。

重要规则:

  • this(...) 必须是构造方法中的第一条语句
  • 你不能在一个构造方法中同时调用 super(...)this(...),因为它们都必须是第一条语句。

示例:

this在Java中到底该怎么用?-图3
(图片来源网络,侵删)
public class Student {
    private String name;
    private int age;
    private String major;
    // 构造方法1:只提供姓名
    public Student(String name) {
        this(name, 18); // 调用构造方法2,并设置默认年龄为18
        System.out.println("构造方法1被调用");
    }
    // 构造方法2:提供姓名和年龄
    public Student(String name, int age) {
        this(name, age, "未定专业"); // 调用构造方法3,并设置默认专业
        System.out.println("构造方法2被调用");
    }
    // 构造方法3:提供所有信息
    public Student(String name, int age, String major) {
        this.name = name;
        this.age = age;
        this.major = major;
        System.out.println("构造方法3被调用");
    }
    public void displayInfo() {
        System.out.println("姓名: " + name + ", 年龄: " + age + ", 专业: " + major);
    }
}
public class Main {
    public static void main(String[] args) {
        System.out.println("--- 创建学生1 ---");
        Student student1 = new Student("Bob");
        student1.displayInfo();
        // 输出:
        // --- 创建学生1 ---
        // 构造方法3被调用
        // 构造方法2被调用
        // 构造方法1被调用
        // 姓名: Bob, 年龄: 18, 专业: 未定专业
        System.out.println("\n--- 创建学生2 ---");
        Student student2 = new Student("Charlie", 20, "计算机科学");
        student2.displayInfo();
        // 输出:
        // --- 创建学生2 ---
        // 构造方法3被调用
        // 姓名: Charlie, 年龄: 20, 专业: 计算机科学
    }
}

分析: 当你调用 new Student("Bob") 时:

  1. 首先执行 Student(String name) 构造方法。
  2. 它的第一条语句是 this(name, 18);,于是调用了 Student(String name, int age) 构造方法。
  3. Student(String name, int age) 的第一条语句是 this(name, age, "未定专业");,于是调用了 Student(String name, int age, String major) 构造方法。
  4. 所有信息被设置,然后执行 System.out.println 的顺序是逆的,因为构造方法调用是层层深入的。

将当前对象作为参数传递给其他方法

当一个方法需要接收一个它所属类的对象作为参数时,可以使用 this 来传递当前对象本身。

示例:

public class Car {
    private String model;
    public Car(String model) {
        this.model = model;
    }
    // 这个方法需要另一个 Car 对象进行比较
    public void compareWith(Car otherCar) {
        if (this.model.equals(otherCar.model)) {
            System.out.println("这两辆车是同一型号: " + this.model);
        } else {
            System.out.println("这两辆车型号不同。");
        }
    }
    // 将当前对象作为参数传递
    public void selfCompare() {
        System.out.println("当前车型: " + this.model);
        System.out.println("正在将当前车辆对象进行比较...");
        compareWith(this); // 将当前对象 this 传递给 compareWith 方法
    }
}
public class Main {
    public static void main(String[] args) {
        Car car1 = new Car("Toyota Camry");
        Car car2 = new Car("Honda Civic");
        car1.compareWith(car2); // 比较两辆不同的车
        System.out.println("--------------------");
        car1.selfCompare(); // 将自己和自己比较
    }
}

输出:

这两辆车型号不同。
--------------------
当前车型: Toyota Camry
正在将当前车辆对象进行比较...
这两辆车是同一型号: Toyota Camry

作为返回值返回当前对象

你可以让方法返回 this,这在方法链(Method Chaining)中非常有用,通过返回当前对象,你可以在一行代码中连续调用多个方法。

示例:

public class Builder {
    private String name;
    private int age;
    private String city;
    public Builder setName(String name) {
        this.name = name;
        return this; // 返回当前 Builder 对象
    }
    public Builder setAge(int age) {
        this.age = age;
        return this; // 返回当前 Builder 对象
    }
    public Builder setCity(String city) {
        this.city = city;
        return this; // 返回当前 Builder 对象
    }
    public void build() {
        System.out.println("创建了一个对象: " + this.name + ", " + this.age + "岁, 来自 " + this.city);
    }
}
public class Main {
    public static void main(String[] args) {
        // 使用方法链,代码更简洁
        new Builder()
            .setName("David")
            .setAge(30)
            .setCity("北京")
            .build();
        // 等同于下面不使用链式调用的写法
        Builder b = new Builder();
        b.setName("David");
        b.setAge(30);
        b.setCity("北京");
        b.build();
    }
}

输出:

创建了一个对象: David, 30岁, 来自 北京

总结表格

用法 描述 示例
区分成员变量和局部变量 当方法参数与成员变量同名时,用 this 指代成员变量。 this.name = name;
调用其他构造方法 在一个构造方法中调用同一个类的另一个构造方法。 this(name, 18); (必须是第一条语句)
传递当前对象 将当前对象作为参数传递给其他方法。 someMethod(this);
返回当前对象 返回当前对象以支持方法链(Method Chaining)。 return this;

thissuper 的区别

thissuper 是两个容易混淆的概念,简单对比如下:

特性 this super
指向 指向当前对象的引用。 指向当前对象的父类对象的引用。
用途 访问当前对象的成员。
调用当前对象的构造方法。
访问父类的成员(变量/方法)。
调用父类的构造方法。
调用构造方法 this(...) super(...)
在构造方法中的位置 必须是第一条语句。 必须是第一条语句。

希望这个详细的解释能帮助你完全理解 this 在 Java 中的用法!

分享:
扫描分享到社交APP
上一篇
下一篇