文章目录
- 一、 为什么要有this引用
- 二、什么是this引用
- 三、this引用的特性
- 四、如何用好this关键字
一、 为什么要有this引用
我们先看一段代码
class Data {public int year;public int month;public int day;public void setDay(int y,int m,int d) {year = y;month = m;day = d;}public void printDay() {System.out.println(year + "/" + month + "/" +day);}
}
public class Test2 {public static void main(String[] args) {//构造三个日期的实例Data data1 = new Data();Data data2 = new Data();Data data3 = new Data();//对三个日期进行设置初始化data1.setDay(2004,8,12);data2.setDay(2004,8,19);data1.printDay();data2.printDay();}
}
如上代码,我们定义了一个Data类,然后实例化两个日期对象。随后我们设置日期(初始化)。我们有两个对象,但是只有一个共同的方法,编译器怎么知道是给那个对象赋值初始化呢?其实就是this这个关键词起到的作用。如下代码所示,其实方法中自带一个隐藏参数this(一般我们自己不写,我们知道就可以)。
public void setDay(Data this,int y,int m,int d) {year = y;month = m;day = d;}
有了这个this,编译器就知道调用各自对象的方法。
this引用的是调用成员方法的对象
还有一个原因,当大家形参名不小心和成员变量名相同时,那函数体中到底是谁给谁赋值?成员变量给成员变量?参数给参数?参数给成员变量?成员变量参数?估计自己都搞不清楚了。如下代码。
public void setDay1(int year,int month,int day) {year = year;month = month;day = day;}public static void main(String[] args) {Data data = new Data();data.setDay1(2023,10,21);data.printDay();}
我们会发现结果全是0。为什么呢?
因为在这个方法中,year,month,day其实都是形参变量,相当于形参自己在给自己赋值,并不是在给对象里面的变量赋值,因为局部变量优先,所以在这个方法中根本拿不到我们对象中的成员变量,也就无法满足我们的需求。
所以需要this关键字来划清他们之间的界限。
二、什么是this引用
this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
根据上图我们就会发现,this引用的其实就是调用成员方法的对象。
三、this引用的特性
- this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型。
- this只能在"成员方法"中使用。
- 在"成员方法"中,this只能引用当前对象,不能再引用其他对象。
- this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收。(如下图所示)
四、如何用好this关键字
就拿上面代码为例子,我们的需求和目的是,用形参变量来给对象中的成员变量赋值初始化。那么我们就要借助this关键字来区分他们。用this关键字课拿到对象中的成员变量。如下代码。
class Data {public int year;public int month;public int day;public void setDay1(int year,int month,int day) {this.year = year;this.month = month;this.day = day;}public void printDay() {System.out.println(year + "/" + month + "/" +day);}
}
public class Test2 {public static void main(String[] args) {Data data = new Data();data.setDay1(2023,10,21);data.printDay();}
}
这样运行就可以满足我们的需求。
总结:当形参变量和对象成员变量的名字相同时,需要借用this来区分
如何形参变量和对象成员变量的名字不同时,用不用this都没有问题,小编这里的建议是不管名字相同还是不同,都使用this。当然,在实际运用中,我们应该根据自己的需求来编写相对应的代码。
以上就是this关键字的详细介绍,相信这篇文章能给大家带来帮助。如果觉得博主写的不错的,可以留下你们的关注和点赞,和博主一起共同进步,一起努力。谢谢大家!也欢迎大家到评论下留言讨论。