JAVA的 this 关键字
1.前言
2.正文
-
this关键字的应用场景有四处:
this.成员变量名(属性)//调用其所代表的对象的成员变量;
this.成员方法名 //调用其所代表的对象的成员方法;
this(); //在构造方法中调用类中的其他构造方法;
return this; //返回对象 -
this.成员变量名的使用示例:
//学生实体类
public class Student {
private int age;//定义int类型的成员变量,当创建一个Student类的对象时,会有默认值0
public void setAge(int age) {//这里的age为形参
age = age;//这里使用形参age为age赋值,与成员变量没关系
}
public void getAge(){
System.out.println("年龄为" + age);//这里打印结果是0
}
}
//学生测试类
public class TestStudent {
public static void main(String[] args) {
//调用Student的构造方法,创建一个Student类对象
Student s = new Student();
//调用Student类的setAge(int age)方法,设置年龄,我们将其设置为15
s.setAge(15);
//调用Student类的getAge()方法,获取年龄
s.getAge();
}
}
我们调用setAge(15)方法,并为其传值15,是想将年龄设置为15,可最后打印结果:
这里,分析一下:
当15这个值被传递到 public void setAge(int age) 这个方法时,形参age的值就是15,然后在方法中:
public void setAge(int age) {//这里的age为形参,值15
age = age;//这里将形参age的值15,赋值给名为age的局部变量。
//因为在java中使用变量的原则是就近原则,所以成员变量age在这里并没有被用到
//所以最后打印成员变量age,结果是默认值0
}
当加上this关键字后,结果就不一样了。修改Student类的代码:
public class Student {
private int age;//定义int类型的成员变量,当创建一个Student类的对象时,会有默认值0
public void setAge(int age) {//局部变量的age
this.age = age;//this.age,代表成员变量的age
//这里的赋值指将局部变量的age值赋给成员变量
}
public void getAge(){
System.out.println("年龄为" + age);
}
}
再运行一遍TestStudent测试类,结果:
所以,当局部变量和成员变量同名时,如果要操作成员变量,最好使用this关键字。
public class Student {
private int age;//定义int类型的成员变量,当创建一个Student类的对象时,会有默认值0
public void setAge(int age) {
this.age = age;
this.getAge();//在setAge成员方法中调用另一个成员方法
}
public void getAge(){
System.out.println("年龄为" + age);
}
}
public class TestStudent {
public static void main(String[] args) {
Student s = new Student();
s.setAge(15);
}
}
打印结果:
在一个成员方法中调用另一个成员方法,这个没什么需要特别注意的。
public class Student {
private int age;//定义int类型的成员变量,当创建一个Student类的对象时,会有默认值0
//无参数构造方法,当没有主动定义时,系统默认提供
public Student() {
//在无参构造方法中调用有参数的构造方法
this(15);
}
//带参数构造方法,自己主动定义,可以用来实例化对象时给对象属性赋值
public Student(int age) {
this.age = age;//为成员变量赋值
System.out.println("年龄为:" + age);//打印成员变量age
}
}
public class TestStudent {
public static void main(String[] args) {
//使用无参构造方法创建Student类对象s
Student s = new Student();
}
}
打印结果:
注意:这里使用this(); 调用构造方法有几个注意事项!!!
*. 使用this();调用构造方法,只能在构造方法中使用!!!
*. this();必须在第一行!!!
*. 在一个构造方法中,只能调用一个构造方法!!!
public class Student {
private int age;//定义int类型的成员变量,当创建一个Student类的对象时,会有默认值0
public Student setAge(int age) {//设置年龄,并返回对象
this.age = age;//为成员变量赋值
return this;//返回this指代的对象,是个值,地址值
}
}
public class TestStudent {
public static void main(String[] args) {
Student s = new Student();
System.out.println(s);//Student类对象,引用数据类型,输出的是地址值
System.out.println(s.setAge(15));//s.setAge()方法会返回一个对象,输出的也是地址值
Student s1 = s.setAge(15);//将返回的对象赋给一个Student类变量,注意是变量
System.out.println(s1);
}
}
运行结果:
分析:
第一个输出语句输出的是Student类对象的地址;
第二个输出语句输出的是Student类对象s调用了setAge()方法后返回的结果,那结果是一个对象,存放的是地址值;
第三个输出语句详解:利用Student类对象s调用setAge()方法后返回一个结果,这个结果是一个对象,存的是地址值,且将这个结果赋给了新创建的Student类变量s1(注意s1是个引用数据类型的变量),这个变量存放了地址值。
为何第二个、第三个输出结果与第一个相同?
看代码:
public Student setAge(int age) {//设置年龄,并返回对象
this.age = age;//为成员变量赋值
return this;//返回this指代的对象,是个值,地址值
}
代码中的return this; 代表的是返回this所指代的对象!!
那么this指代的对象是谁?
我的理解:
哪个对象调用了方法,那么此时this指代的便是哪个对象!
因为s.setAge(15)
调用setAge方法的是Student的对象s,所以此时this指代的便是s这个对象!所以第二个输出结果是对象s的地址。
同理。
第三个输出语句 Student s1 = s.setAge(15);
等号右边 s.setAge(15)代表Student对象s调用方法,并返回s
等号左边 创建一个Student类变量s1,用来接收右边的返回结果! 所以此时s1的值是对象s的值,也就是对象s的地址值!所以输出结果相同!
3.思维导图总结
4.参考文章
https://blog.csdn.net/benxiangsj/article/details/124282800