作数堆栈也是同样的情况。如前所述,jvm 不直接
支持 boolean 类型,java 编译器总是用 ints 来表示 boolean。但 java 对 byte,short
和 char 是支持的,这些类型的值可以作为实例变量
存储在局部变量区中,也可以作为类变量存储在方法区中。但在局部变量区和
操作数堆栈中都被转成了 ints 类型的值,期间的运算也是以 int 来的,只当存回
堆或方法区中,才会转回原来的类型。
同样需要注意的是 runClassMethod()的对象 o。在 java 中,所以的对象都以引用
(reference)传递。所有的对象都存储在堆中,你永远都不会在局部变量区或操作
数堆栈中发现对象的拷贝,只会有对象引用。
编译器对局部变量的放置方法可以多种多样,它可以任意决定放置顺序,甚至
可以用一个索引指代两个局部变量。例如,当两个局部变量的作用域不重叠时,
如 Example3b 的局部变量 i 和 j。
// On CD-ROM in file jvm/ex3/Example3b.java
class Example3b {
public static void runtwoLoops() {
for (int i= 0; i < 10; ++i) {
System.out.println(i);
}
for (int j= 9; j >= 0; --j) {
System.out.println(j);
}
}
}
jvm 的实现者对局部变量区的设计仍然有象其他数据区一样的灵活性。关于
long 和 double 数据如何分布在数组中,jvm 规范没有指定。假如一个 jvm 实现
的字长为 64 位,可以把 long 或 double 数据放在数组中的低项内,而使高项为
空。(在字长为 32 位的时候,需要两项才能放下一个 long 或 double)。
操作数堆栈
操作数堆栈象局部变量区一样是用一个类型为 word 的数组存储数据,但它不是