「 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(参数列表),专门用于一个构造方法调用本类另一个构造方法。(仅限构造方法)
硬性语法规则
this()必须是构造方法中第一条可执行语句,前面只能有注释或空行,否则编译报错。- 不能互相循环调用(A 构造调 B,B 又调 A,会死循环报错)
- 普通方法不能写 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() 链式调用,执行顺序为:
- 双参构造 →
this(name)→ 单参构造 - 单参构造 →
this()→ 无参构造 - 无参构造执行完毕,回到单参构造继续执行
this.name = name - 单参构造执行完毕,回到双参构造继续执行
this.age = age
所以控制台先打印"无参构造",再打印"单参构造",最后打印"双参构造"。
七、全文核心小结
this代表当前对象本身,只能存在对象方法 / 构造方法中。this.变量名:区分成员变量与局部变量重名,开发最常用。this.方法名():调用本类普通方法,this 可以省略。this(参数):调用本类其他构造方法;必须是构造方法中第一条可执行语句,不能循环调用。- static 静态方法,禁止使用 this。
🚀建议自己动手敲一遍综合案例,观察 this() 的调用顺序。