当调用一个方法时,会向他自动传递一个隐式实参,他是对调用对象(即调用方法的对象)的一个引用.这个应用就叫做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; }