我正在createString()函数中创建一个String对象,并返回对其的引用。当我打印在createString中创建的对象的hashCode和返回给main方法的对象的hashCode时,引用指向相同的对象。我的问题是-
在createString()函数堆栈中创建的对象超出了main方法的范围,那么为什么可以从main方法访问它?
import java.util.*;
public class Temp {
public static void main(String[] args) {
Temp temp = new Temp().createString();
System.out.println(Integer.toHexString(System.identityHashCode(temp)));
}
public final Temp createString() {
Temp strs = new Temp();
System.out.println(" string identity: " + Integer.toHexString(System.identityHashCode(strs)));
return strs;
}
}
答案 0 :(得分:2)
简单的答案是,您正在createString中(在堆上)创建一个对象,并将其返回给main。因为它在堆上,并且因为main现在有对其的引用,所以它仍然是有效且可行的String / Object
就范围规则而言,它们仅在编译时适用,并且仅适用于变量的user defined label names
,而不适用于它们所持有的data/content
。