this关键字

当调用一个方法时,会向他自动传递一个隐式实参,他是对调用对象(即调用方法的对象)的一个引用.这个应用就叫做this.为了理解this,我们首先考虑下面的程序,他创建了一个名为pwr的类,该类计算数值不同幂的结果.
public class test2
{
    // @param args
    public static void main(String args[])
    {
        Pwr x = new Pwr(4.0,2);
        Pwr y = new Pwr(2.5,1);
        Pwr z = new Pwr(5.7,0);
        
        System.out.println(x.b + " raised to the  "+x.e+" power is "+x.getPwr());
        System.out.println(y.b + " raised to the  "+y.e+" power is "+y.getPwr());
        System.out.println(z.b + " raised to the  "+z.e+" power is "+z.getPwr());
    }
}
class Pwr
{
    double b,val;
    int e;
    
    Pwr(double base, int exp)
    {
        b = base;
        e = exp;
        val = 1;
        
        if(exp == 0) return;
        for(;exp>0;exp--) val = val * base;
    }
    
    double getPwr()
    {
        return val;
    }
}
输出:
4.0 raised to the 2 power is 16.0
2.5 raised to the 1 power is 2.5
5.7 raised to the 0 power is 1.0
如你所知,在一个方法中,无需对象或类的限定就可以直接访问类中的其他方法.因此,在getPwr()中,语句:
retrun val;
意味着要返回与调用对象相关的val的副本.然而,同一条语句也可以这样写:
return this.val;
这里,this引用了调用getPwr()的对象.因此,this.val引用了调用对象的val副本.例如,如果已经调用了x和getPwr(),那么在前面语句中的this就会引用x.不使用this来编写语句仅仅是为了方便.
下面使用this引用编写完整的Pwr类:
class Pwr
{
    double b,val;
    int e;
    
    Pwr(double base, int exp)
    {
        this.b = base;
        this.e = exp;
        this.val = 1;
        
        if(exp == 0) return;
        for(;exp>0;exp--) this.val = this.val *  base;
    }
    
    double getPwr()
    {
        return this.val;
    }
}
事实上,没有Java程序员会编写如上所示的Pwr类,因为这样做不会带来任何好处,而使用标准形式会更为简单.然而,this有一些重要的用途.例如,Java语法允许形参名或局部变量名与实例变量名一致.当发生这种情况时,局部变量名会隐藏实例变量.通过使用this引用他,可以得到隐藏实例变量的访问权.例如,尽管不是推荐的形式,但是在语法上,下面的Pwr()构造函数是有效的:
    Pwr(double b, int e)
    {
        this.b = b;
        this.e = e;
        this.val = 1;
        
        if(e == 0) return;
        for(;e>0;e--) this.val = this.val * b;
    }