文章简介:记录 Java 中 this 关键字的相关知识点。
第一次使用 this 关键字是在访问实例变量(对象级别的变量)的时候,this 关键字储存了当前对象的地址,所以可以使用它来访问实例变量或者实例方法。
public class Example01 {
public static void main(String[] args) {
// 创建学生对象
Student student0 = new Student();
// 打印 student0 对象的默认信息
System.out.println(student0);
// 修改 student0 对象的属性
student0.setName("张三");
student0.setNo("21765622");
student0.setAge(20);
// 打印修改后的信息
System.out.println(student0);
}
}
// 学生类
class Student {
// 学生姓名
private String name;
// 学号
private String no;
// 年龄
private int age;
// 无参构造方法,在初始化的时候调用本类的其他构造方法为对象的实例对象赋初始值,提示相关信息
public Student() {
this("未赋值", "未赋值", -1);
}
// 有参构造方法
public Student(String name, String no, int age) {
this.name = name;
this.no = no;
this.age = age;
}
// Setter 和 Getter 方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
// 重写 toString 方法,打印学生对象的相关信息(如果不了解 toString 的话,先别急,我之后会记录相关的笔记的)
public String toString(){
return "学生姓名:" + this.getName() + ",学号:" + this.getNo() + ",年龄:" + this.getAge();
}
}
输出结果:
学生姓名:未赋值,学号:未赋值,年龄:-1
学生姓名:张三,学号:21765622,年龄:20
在上面的例子中,一共有四处不同的地方出现了 this 关键字,分别是:构造方法的内部、Setter 方法的内部、Getter 方法的内部、引用对象的实例变量时,接下来我们一个一个来看一下在这些地方中 this 关键字的作用。
构造方法内部的 this
构造方法内部 this 的作用是引用本类方法中的其他构造方法,提高代码的复用率,像在上面这个例子中,我们在无参构造方法的内部调用了一个有参的构造方法,为一个在创建是没有任何参数的对象属性赋予相应的默认值,为后期使用该对象是提供提醒的功能。
注意:在构造方法里面使用 this 关键字时,必须放在构造方法的第一行,否则就会报错,例如将上面例子中的无参构造方法修改成下面的样子试一下
public Student() {
System.out.println("我是无参构造方法的第一行代码");
this("未赋值", "未赋值", -1);
}
运行代码,出现以下报错提示:
java: 对this的调用必须是构造器中的第一个语句
Setter 方法内部的 this
Setter 方法中 this 关键字的作用是将局部变量和示例变量区分开,提高代码的可读性,至于具体的效果我们可以来看一下上面例子中的一个 Setter 方法,其他的 Setter 方法以此类推。
public void setName(String name) {
this.name = name;
}
在这个 Setter 方法中,出现了两个 “name” ,这两个 “name” 分别代表了不同的含义,在赋值符号 “=” 右边的 “name” 代表的是 setName 方法的参数,而赋值符号左边的 “name” ,其前面有 this 关键字进行修饰,代表的是调用该方法的对象的 “name” 属性。那如果我们把 this 关键字删掉的话会发生什么呢?
public void setName(String name) {
name = name;
}
如果我们将 this 关键字删掉的话,那么这里出现的 “name” 都是代表了该方法的局部变量 “name” ,这个局部变量自己给自己赋值,并不能达到设置对象 “name” 属性的作用(就是说 Setter 方法没有达到它应有的功能)。
测试
public class Example01 {
public static void main(String[] args) {
// 创建学生对象
Student student0 = new Student();
// 打印 student0 对象的默认信息
System.out.println(student0);
// 尝试修改 name 属性
student0.setName("李四");
// 打印学生对象的信息
System.out.println(student0);
}
}
输出结果:
学生姓名:未赋值,学号:未赋值,年龄:-1
学生姓名:未赋值,学号:未赋值,年龄:-1
可以看到,调用了 student0 对象的 setName() 方法后,他的名字并没有按照该方法应有的功能对对象的名字进行修改操作。
Getter 方法中的 this
Getter 方法中的 this 关键字作用和 Setter 中的一模一样,就是为了区分局部变量和实例变量。
toString 方法中的 this
这里的 this 的作用和 Setter 方法还有 Getter 方法中的作用一模一样,是为了说明使用的变量是实例变量。其实在其他方法中使用的 this 关键字的作用也是为了说明使用的变量是实例变量,注意:这里说的方法是指实例方法,因为只有实例方法在调用的时候有对象,this 可以存储这个对象的地址,指向这个对象,一个静态方法在调用的时候是不需要有对象的,静态方法中的 this 就没有指向一个对象,所以无法在静态方法中使用 this 关键字。
例如我们在上面的 Student 类中加入一个如下的静态方法
// 静态方法
public static void staticMethod(){
System.out.println("我是一个静态的方法");
System.out.println(this.getName());
}
运行该代码,会发现报错:
java: 无法从静态上下文中引用非静态 变量 this