其实this关键字是很容易理解的,下面我举两个例子作对比,可能你就看明白了:
<1>没有使用this的情况:
class A
{
private int aa,bb;//声明两个整形变量
public int returnData(int x,int y) //一个返回整形数的方法
{
aa = x;
bb = y;
return aa + bb;
}
}
<2>使用this的情况
class A
{
private int aa,bb;//声明两个整形变量
public int returnData(int aa,int bb) //一个返回整形数的方法
{
this.aa = aa;//第一个aa是全局变量的aa,后一个aa是参数aa
this.bb = bb;//第一个bb是全局变量的bb,后一个bb是参数bb
return (this.aa + this.bb);
}
}
//////////////////////////////////////////////////
请看下面程序中
MyDate newDay=new MyDate(this);
this是什么作用?
class MyDate{
private int day;
private int month;
private int year; //定义三个成员变量;
public MyDate(int day,int month,int year){
this.day=day;
this.month=month;
this.year=year;
} //构造方法;
public MyDate(MyDate date){
this.day=date.day;
this.month=date.month;
this.year=date.year; //将参数Date类中的成员变量赋给MyDate类;
} //构造方法;
public int getDay(){
return day;
}//方法;
public void setDay(int day){
this.day=day;//参数Day赋给此类中的Ddy;
}
public MyDate addDays(int moreDay){
MyDate newDay=new MyDate(this);
newDay.day=newDay.day+moreDay;
return newDay; //返回整个类;
}
public void print(){
System.out.println("My Date: "+year+"-"+month+"-"+day);
}
}
public class TestMyDate{
public static void main(String args[]){
MyDate myBirth=new MyDate(19,11,1987); //利用构造函数初始化;
MyDate next=myBirth.addDays(7);
//addDays()的返回值是类,将其返回值赋给变量next;
next.print();
}
}
结论:
上面的两个类,本质是相同的,而为什么在第<2>类中使用this关键字呢,注意到第<2>类中的方法returnData(int aa,int bb),形式参数分别为aa和bb,刚好和“private int aa,bb;”这里的变量名是一样的,现在问题来了:在returnData的方法体中如何区别形式参数aa和全局变量aa,两 个 bb也是如此?这就是引入this关键字的用处所在了!this.aa表示的是全局变量的aa,而没有加this的aa表示形式参数的aa,bb也是如此!
建议:
在编程中,过多的使用this关键字不是好方法。这从上面也看得出来,相同的变量名加上this关键字过多时,有时会让人分不清哪个是对哪个。这时可以使用以下方法修改,避免使用this关键字:
<3>
class A
{
private int aa,bb;//声明两个整形变量
public int returnData(int aa1,int bb1)
{
aa = aa1;//在aa后面加上一数字1加以区分,其他以此类推
bb = bb1;
return aa + bb;
}
}
总结:
可以看出,上面的<1>,<2>,<3>都是一样的,但<3>既避免了使用this关键字,又避免了<1>中x和y 这种参数意思不明确的缺点.所有建议使用<3>一样的方法!
|