下面是Think in Java 4th上的一段代码,作者想要展示this可以将对象传递到其他方法的一个例子。但是我没怎么看懂,谁能详细讲解一下?public class PassingThis {
public static void main(String[] args) {
new Person().eat(new Apple());
}
}class Person{
public void eat(Apple apple){
Apple peeled = apple.getPeeled();
System.out.println("Yummy");
}
}class Apple{
Apple getPeeled(){
return Peeler.peel(this);
}
}class Peeler{
static Apple peel(Apple apple){
//... remove peel
return apple;//Peeled
}
}

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【luna_wind】截止到2008-07-18 10:06:24的历史汇总数据(不包括此帖):
    发帖的总数量:1                        发帖的总分数:0                        每贴平均分数:0                        
    回帖的总数量:0                        得分贴总数量:0                        回帖的得分率:0%                       
    结贴的总数量:0                        结贴的总分数:0                        
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:1                        未结的总分数:0                        
    结贴的百分比:0.00  %               结分的百分比:---------------------
    无满意结贴率:---------------------无满意结分率:---------------------
    如何结贴请参考这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html
      

  2.   

    分析下这个程序在内存中的运行情况应该是这样的
    首先:在内存中创建了一个Person对象,然后调用Person对象的eat方法,eat方法接受一个Applet类型的参数,这里传入的参数是一个新建的Applet对象,java中的参数传递是引用传递,这里传入eat方法的是一个指向新创建的Applet对象的句柄(引用),然后看apple.getPeeled()方法,这个方法是调用了Peeler的静态方法peel,方法返回一个传入的Applet对象,就是这里传入的this.就是在内存中创建的那歌Applet对象。这样说可能不是很清楚,看一下这个程序在内存中的执行情况吧。java的内存分配是这样的,基本数据类型保存在栈内存中,对象保存在堆内存中,在栈中保存的是对象的句柄(一个指向对象的引用)。再从内存中对象的创建角度来分析这个程序,程序先创建了一个匿名的Person对象,创建的过程是:在堆内存中创建了一个Person对象的实例,然后在栈内存中分配了一个内存空间保存指向堆内存中Person对象的句柄,实际是保存的对象在对内存中的地址,然后调用eat方法,调用eat方法的时候创建了一个匿名的Applet对象,这个时候,在堆内存中创建了一个Applet对象,然后在栈中分配一个内存空间来存储指向这个Applet对象的引用,也就是Applet对象在堆内存中的地址,然后将这个地址作为参数传给eat方法,在eat方法中,又创建了一个Applet类型的变量peeled,它的值是传入的Applet对象调用Applet对象的getPeeled后返回的值,关键就在这里了,getPeeled方法,调用Peeler类静态方法peel传入的参数this,在java中表示的是对象本身,也就是刚刚生成的那歌Applet对象的引用即内存中Applet对象的地址值,所以这个方法返回的还是刚刚创建的那个Applet对象。java在内存中将peeled指向最初生成的那个Applet对象