首先先来看一段程序:
public class Test
{
public static void main(String[] args)
{
int i = 3;
int s1, s2, s3 = 0;
s1 = (i++) + (i++) + (i++);
i = 3;
s2 = (++i) + (++i) + (++i);
for (i = 0;i < 10;i ++)
{
s3 = s3 ++;
}
System.out.println("s1=" + s1);
System.out.println("s2=" + s2);
System.out.println("s3=" + s3);
}
}
结果:
s1=12
s2=15
s3=0
结果或许不是想象中的那样;
因为Java中存在中间缓存变量的机制,在Java语言中,编译时并没有为变量分配内存,仅仅是创建了一种类型变量的对象引用,在类文件被解释执行时,每次都要为所执行到的变量创建一个临时对象(分配内存),如变量i,编译时并未分配内存,在运行时执行到赋值语句i=3时,会创建一个整形变量对象并初始化为3;
计算s1和s2时,是前置时先计算后使用,后置时先使用后计算;变量i使用了三次,就会分别创建三个临时的整形变量对象,分配相应的内存空间,用来存储每次对自增表达式的计算结果;
所以
s1 = ( i++ ) + ( i++ ) + ( i++ ) = 3 + 4 + 5 = 12
s2 = ( ++i ) + ( ++i ) + ( ++i ) = 4 + 5 + 6 = 15
而对于s3亦是如此,对于 s3 = s3 ++而言,Java的中间缓存变量机制可以使具体的执行过程理解为:
1.生成临时变量: int temp;
2.将s3的值拷贝给临时变量: temp = s3;
3.s3加1: s3 = s3 + 1;
4.返回临时变量的值,并将此值赋值给s3: s3 = temp;
可见,在Java语言的程序运行过程中,变量在每一次被引用时,都会创建相应的对象实例,分配相应的内存区域,其中的内容不会被重写,在变量的生命周期内的每一次引用就会有一个临时的实例对象被建立,它们的值互不影响。