如果有两个同类型的对象分别叫作a和b那么您也许不知道如何为这两个对象同时调用一个f()方法
class Banana { void f(int i) { /* */ } }
Banana a = new Banana() b = new Banana();
af();
bf();
若只有一个名叫f()的方法它怎样才能知道自己是为a还是为b调用的呢?
为了能用简便的面向对象的语法来书写代码——亦即将消息发给对象编译器为我们完成了一些幕后工作其中的秘密就是第一个自变量传递给方法f()而且那个自变量是准备操作的那个对象的句柄所以前述的两个方法调用就变成了下面这样的形式
Bananaf(a);
Bananaf(b);
这是内部的表达形式我们并不能这样书写表达式并试图让编译器接受它但是通过它可理解幕后到底发生了什么事情
假定我们在一个方法的内部并希望获得当前对象的句柄由于那个句柄是由编译器秘密传递的所以没有标识符可用然而针对这一目的有个专用的关键字thisthis关键字(注意只能在方法内部使用)可为已调用了其方法的那个对象生成相应的句柄可象对待其他任何对象句柄一样对待这个句柄但要注意假若准备从自己某个类的另一个方法内部调用一个类方法就不必使用this只需简单地调用那个方法即可当前的this句柄会自动应用于其他方法所以我们能使用下面这样的代码
class Apricot {
void pick() { /* */ }
void pit() { pick(); /* */ }
}
在pit()内部我们可以说thispick()但事实上无此必要编译器能帮我们自动完成this关键字只能用于那些特殊的类——需明确使用当前对象的句柄例如假若您希望将句柄返回给当前对象那么它经常在return语句中使用
//: Leafjava
// Simple use of the this keyword
public class Leaf {
private int i = ;
Leaf increment() {
i++;
return this;
}
void print() {
Systemoutprintln(i = + i);
}
public static void main(String[] args) {
Leaf x = new Leaf();
xincrement()increment()increment()print();
}
} ///:~
由于increment()通过this关键字返回当前对象的句柄所以可以方便地对同一个对象执行多项操作