public Class A {
public static String s = "s";
public static int i = 0;
public int j = 1;
public static String getStaticString() {
int k = 2;
return s;
}
public String getString() {
int l = 3;
return "something";
}
}
在Java
中,静态变量存储在Perm
代Heap Segment
中,原始局部变量存储在Stack Segment
中。
那么i
,j
,k
,l
存储在哪里?函数getString()
存储在哪里?
答案 0 :(得分:3)
这些是实现细节,我们无法在不首先阅读和理解其源代码的情况下确定每个实现的功能。就我的知识和经验而言,最合理的假设(对于桌面JVM)是这样的:
s
和i
是静态变量。静态变量可能在永久生成中的堆上分配。 j
存储在类A
的实例中。类实例可以存在于堆栈中(如果引用的转义分析可以证明引用具有自动存储语义 - 并且它们足够小)或堆(如果未执行转义分析或不确定或实例对于栈)。k
是一个具有自动存储语义的局部变量,因此它应该存在于堆栈中。在输入包含方法(getStaticString
)时分配,并在退出其包含方法时将其解除分配。l
与k
具有相同的语义。其包含方法(getString
)不是静态的这一事实无关紧要。getString
(以及任何其他用户代码,无论其语言属性如何是静态的,非静态的等)都有两种表示形式: