this 关键字是 Java 常用的关键字,可用于任何实例方法内指向当前对象,也可指向对其调用当前方法的对象,或者在需要当前类型对象引用时使用。
一、局部变量与成员变量同名
假设有一个时间类Time的定义如下:
class Time {
private int year;
private int month;
private int day;
}
在上述代码中,为了防止类外部对类中的原始属性进行改变,所以我们将时间类 Time 的属性进行了私有化,我们可以通过为时间类 Time 添加一个构造方法传递参数进行修改,并且添加一个成员方法进行输出。代码如下:
public Time(int year,int month,int day){
this.year = year;
this.month = month;
this.day = day;
}
public void show(){
System.out.println("年:"+year+"月:"+month+"日:"+day);
}
我们在 Time 类的构造方法中使用了 this 关键字对属性 year,month 和 day 赋值。this.year=year
语句表示一个赋值语句,等号左边的 this.year
是指当前对象具有的变量(当前类具有的属性)year
,等号右边的year
表示参数传递过来的数值。
我们创建一个代码来看一下输出结果:
public class Main {
public static void main(String[] args) {
Time time1 = new Time(2023,1,1);
time1.show();
}
}
结果如下:
总结:
当一个类的成员变量(属性)名与访问该成员变量的方法参数名相同时,则需要使用 this 关键字来区分成员变量和方法参数。
二、访问构造方法
我们知道,构造方法分两种,有参构造和无参构造,this 的第二种用法就是访问本类的构造方法。
假设有一个时间类 Time 如下:
class Time {
private int year;
private int month;
private int day;
//无参构造器,输出为2023.1.1
public Time(){
System.out.println("2023.1.1");
}
//有参构造器,输出等待传递参数
public Time(int year,int month,int day){
this.year = year;
this.month = month;
this.day = day;
}
//输出的成员方法
public void show(){
System.out.println("年:"+year+" 月:"+month+" 日:"+day);
}
}
我们创建一个代码来看一下输出结果:
public class Main {
public static void main(String[] args) {
Time time1 = new Time(); //调用空参构造器实例化类
Time time2 = new Time(2023,2,2); //调用有参构造器实例化
time2.show(); //调用方法中的输出
}
}
结果如下:
接下来我们将this 的第二种方法运用进我们的代码中。代码如下:
class Time {
private int year;
private int month;
private int day;
//无参构造器,在其中利用this调用有参构造器
public Time(){
this(2023,1,1);
}
//有参构造器,输出等待传递参数
public Time(int year,int month,int day){
this.year = year;
this.month = month;
this.day = day;
}
//输出的成员方法
public void show(){
System.out.println("年:"+year+" 月:"+month+" 日:"+day);
}
}
我们创建一个代码来查看输出结果,代码如下:
public class Main {
public static void main(String[] args) {
Time time1 = new Time(); //无参构造器实例化
time1.show(); //调用方法中的输出
Time time2 = new Time(2023,2,2); //有参构造器实例化
time2.show(); //调用方法中的输出
}
}
结果如下:
注意事项:
1.this()只能在构造方法中使用,根据使用目的自行决定是否添加参数。
2.在构造方法中使用时,必须是第一条语句。
三、同类中方法的调用
this 关键字的第三个作用就是我们可以通过其来访问该类中的另一个成员方法。
我们假设有一个时间类 Time 如下:
class Time {
private int year;
private int month;
private int day;
public Time(int year,int month,int day){
this.year = year;
this.month = month;
this.day = day;
}
public void outshow(){
int outyear = year - 1;
System.out.println("去年此刻:年:"+outyear+" 月:"+month+" 日:"+day);
}
public void show(){
System.out.println("年:"+year+" 月:"+month+" 日:"+day);
}
}
如果我们想在 show 成员方法中调用 outshow 成员方法,那么我们如果不采用 this 的方式,我们就需要在 show 方法中实例化 Time 类,代码如下:
public void show(){
Time time = new Time(year,month,day);
time.outshow();
System.out.println("年:"+year+" 月:"+month+" 日:"+day);
}
我们创建一个代码来看一下输出结果:
public class Main {
public static void main(String[] args) {
Time time1 = new Time(2023,1,1);
time1.show();
}
}
结果如下:
确实达到了我们想要的目的,但是我们来思考一个问题,我们在 Time 类中创建了一个对象,在 Main 类中又创建了一个对象,我们是否真的需要创建两个对象,我们都知道,每创建一个对象,都需要给对象分配一定的内存空间,我们有没有一个更加方便简洁省内存的方法呢?这就是 this 的第三个作用了,调用类内部的成员方法。代码如下:
public void show(){
this.outshow();
System.out.println("年:"+year+" 月:"+month+" 日:"+day);
}
结果如下:
同样可以实现我们想要的结果,同时Java也允许对象的一个成员直接调用另一个成员,省略this前缀,代码如下:
public void show(){
outshow();
System.out.println("年:"+year+" 月:"+month+" 日:"+day);
}
结果如下:
但我们需要知道的是,this 只是我们看着省略了,编译器也会为我们加上,实际上这个 this 是一直存在的
注意事项:
1.static 修饰的静态类不能使用 this 引用
2.静态成员不能直接访问非静态成员