class Person { 
   public void eat(Apple apple) { 
    Apple peeled = apple.getPeeled(); 
    System.out.println("Yummy"); 
} 
} 
class Peeler { 
    static Apple peel(Apple apple) { 
        return apple; 
} 
} 
class Apple { 
    Apple getPeeled() {return Peeler.peel(this);} 
} 
 
public class PassingThis { 
    public static void main(Stringp[ args) { 
    new Person().eat(new Apple()); 
} 
} 
======================================== 
先自己看了一遍,果然是专门考查对this的理解的。 
程序的运行从主函数开始, 
1.new Person().eat(new Apple()); 
在堆内存中建立了一个Person对象,一个Apple对象。Person对象调用了方法eat(),并将新创建的Apple对象传入其中。 
2.Apple peeled = apple.getPeeled(); 
Apple类型的引用peeled接收了Apple对象的getPeeled方法返回的apple对象,getPeeled方法则是把堆内存中的Apple对象传入了Peeler类的peel静态方法,peel方法直接返回了传入的Apple对象,即堆内存中的Apple对象。绕了一大圈,peeled实际上最终得到了一开始堆内存中建立的Apple对象。 
3.System.out.println("Yummy"); 
这句话就不绕了,输出“Yummy”。 
4.程序执行完毕。 
 |