编译器是否违反了作用域规则?

时间:2018-12-06 20:53:52

标签: java

我正在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;
    }
}

1 个答案:

答案 0 :(得分:2)

简单的答案是,您正在createString中(在堆上)创建一个对象,并将其返回给main。因为它在堆上,并且因为main现在有对其的引用,所以它仍然是有效且可行的String / Object

就范围规则而言,它们仅在编译时适用,并且仅适用于变量的user defined label names,而不适用于它们所持有的data/content