日期:2014-05-20  浏览次数:20580 次

java中函数块应该会在执行后被销毁吧 ?
在C/C++中,每一个函数中自定义的变量,其生命周期长度 == 函数执行的长度,即“}”时销毁变量!
比如 void funtion(){int a;},在调用function()后,执行到"}"时销毁a!

我在看java的内部类,却发现了一个我实在是想不通的地方,望高手们指点 !
这是我在一个CSDN博客上看到的代码:

public interface Contents {  
    int value();  
}  
public interface Destination {  
    String readLabel();  
}
public class Goods1 {
public Destination dest(String s) {
class GDestination implements Destination {
private String label;
private GDestination(String whereTo) {
label = whereTo;
}
public String readLabel() {
return label;
}
}
return new GDestination(s);
}
public static void main(String[] args) {
Goods1 g = new Goods1();
Destination d = g.dest("Beijing");
                System.out.println(d);
}
}


在以上的代码中,Goods1类里面有一个dest(String s)方法,在dest方法里面,定义了一个内部类GDestination来实现接口Destination ,之后返回一个new GDestination(s);

问题:
   我的理解:
    dest方法中,GDestination是一个内部类,依照我的理解,这个new GDestination(s)的生命期长度只是等同于dest{}执行期长度,dangdest执行完毕后,new GDestination(s)被销毁!
    那么,main函数中Destination d = g.dest("Beijing");  中,先执行右边g.dest("Beijing"); ,执行时return 返回一个new GDestination(s)的地址,执行遇到"}"后new GDestination(s)被销毁,此时原本的new GDestination(s)变成了 null ,接着才执行 " = ",把null赋值给d,则d为null !
   
   但实际上,d不是null,用Eclipse运行发现,存在结果,结果为:Goods1$1GDestination@1fc4bec ,这显然是一个存在的空间!

我的价值观瞬间被颠覆了,我很是想不通,求解析 ... 

------解决方案--------------------
java有自动回收机制。
------解决方案--------------------
跟类定义在什么地方无关,关键在于return,它将Destination对象的引用返回给调用者了,因此不会为null的。
可以试试这样的调用:

    class GDestination//此类在Goods1内部
        implements Destination