一.为什么要有this引用?
先来看一段简单滴代码:
public class Date { int year; int month; int day; public void print() { System.out.println("年" + year + "月" + month + "日" + day); } public void set(int year,int month,int day){ year = year; // 属于自己给自己赋值,也就是局部变量给局部变量赋值 month = month; day = day; } public static void main(String[] args) { Date date = new Date(); date.set(2023,9,9);//那个对象调用成员方法,this就指向这个对象 date.print(); } }
在以上代码中: 我们不难发现以下问题
成员方法set中,形参名称与成员变量的名称相同了,那么这样会出现什么样的情况?
以下是运行结果:
这样的状况,就导致了自己给自己赋值,那么编译器会默认为成员变量没有被赋值,也就是0;
再来看一段代码:
public class Date { int year; int month; int day; public void print() { System.out.println("年" + year + "月" + month + "日" + day); } public void set(int y,int m,int d){ year = y; // 属于自己给自己赋值,也就是局部变量给局部变量赋值 month = m; day = d; } public static void main(String[] args) { Date d1 = new Date(); Date d2 = new Date(); Date d3 = new Date(); d1.set(2023,9,11); d2.set(2023,9,11); d3.set(2023,9,11); d1.print(); d2.print(); d3.print(); } }
我们看到,new的三个对象d1,d2,d3都在用set和print这两个成员方法,那么成员方法是如何知道是谁调用的自己呢?
这其中的一切皆与this有关
二.什么是this引用?
先来看定义:this引用指向当前对象(调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。
代码如下:
public class Date { public int year; public int month; public int day; public void setDay(int year, int month, int day){ this.year = year; this.month = month; this.day = day; } public void printDate(){ System.out.println(this.year + "/" + this.month + "/" + this.day); } } public static void main(String[] args) { Date d = new Date(); d.setDay(2020,9,15); d.printDate(); }
总结:this引用的是调用成员方法的对象。比如d1调用了set方法,那么在传参的时候,d1的地址也被以一种隐蔽的方式传到了set方法中(下面讲解),那么set就知道是谁调用的自己了。
三.this引用的特性
1.那个对象调用,就是那个对象的引用类型。
2.this只能在成员方法中使用
3.在成员方法中,this只能引用当前对象,不能引用其他对象
4.this是成员方法第一个隐藏的参数,编译器会自动传递。在成员方法执行时,编译器会将调用成员方法的这个对象的引用来传递给该成员方法,this负责来接受。