合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
## [this关键字](https://lingcoder.gitee.io/onjava8/#/book/06-Housekeeping?id=this%e5%85%b3%e9%94%ae%e5%ad%97) 对于两个相同类型的对象**a**和**b**,你可能在想如何调用这两个对象的`peel()`方法: ~~~ // housekeeping/BananaPeel.java class Banana { void peel(int i) { /*...*/ } } public class BananaPeel { public static void main(String[] args) { Banana a = new Banana(), b = new Banana(); a.peel(1); b.peel(2); } } ~~~ 如果只有一个方法`peel()`,那么怎么知道调用的是对象**a**的`peel()`方法还是对象**b**的`peel()`方法呢?编译器做了一些底层工作,所以你可以像这样编写代码。`peel()`方法中第一个参数隐密地传入了一个指向操作对象的 引用。因此,上述例子中的方法调用像下面这样: ~~~ Banana.peel(a, 1) Banana.peel(b, 2) ~~~ 这是在内部实现的,你不可以直接这么编写代码,编译器不会接受,但能说明到底发生了什么。假设现在在方法内部,你想获得对当前对象的引用。但是,对象引用是被秘密地传达给编译器——并不在参数列表中。方便的是,有一个关键字:**this**。**this**关键字只能在非静态方法内部使用。当你调用一个对象的方法时,**this**生成了一个对象引用。你可以像对待其他引用一样对待这个引用。如果你在一个类的方法里调用该类的其他方法,不要使用**this**,直接调用即可,**this**自动地应用于其他方法上了。因此你可以像这样: ~~~ // housekeeping/Apricot.java public class Apricot { void pick() { /* ... */ } void pit() { pick(); /* ... */ } } ~~~ 在`pit()`方法中,你可以使用`this.pick()`,但是没有必要。编译器自动为你做了这些。**this**关键字只用在一些必须显式使用当前对象引用的特殊场合。例如,用在**return**语句中返回对当前对象的引用。 ~~~ // housekeeping/Leaf.java // Simple use of the "this" keyword public class Leaf { int i = 0; Leaf increment() { i++; return this; } void print() { System.out.println("i = " + i); } public static void main(String[] args) { Leaf x = new Leaf(); x.increment().increment().increment().print(); } } ~~~ 输出: ~~~ i = 3 ~~~ 因为`increment()`通过**this**关键字返回当前对象的引用,因此在相同的对象上可以轻易地执行多次操作。 **this**关键字在向其他方法传递当前对象时也很有用: ~~~ // housekeeping/PassingThis.java class Person { public void eat(Apple apple) { Apple peeled = apple.getPeeled(); System.out.println("Yummy"); } } public class Peeler { static Apple peel(Apple apple) { // ... remove peel return apple; // Peeled } } public class Apple { Apple getPeeled() { return Peeler.peel(this); } } public class PassingThis { public static void main(String[] args) { new Person().eat(new Apple()); } } ~~~ 输出: ~~~ Yummy ~~~ **Apple**因为某些原因(比如说工具类中的方法在多个类中重复出现,你不想代码重复),必须调用一个外部工具方法`Peeler.peel()`做一些行为。必须使用**this**才能将自身传递给外部方法。