看下面一道面试题
package Test01;
public class Demo02 {
public static void main(String[] args) {
Demo02 demo02=new Demo02();
int i=0;
int j=0;
demo02.show(i);//1
System.out.println("i等于:"+i);
i=i++;//2
System.out.println("i等于:"+i);
j=i++;//3
System.out.println("i等于:"+i+" j等于:"+j);
}
void show(int i){
i++;
}
}
结果:
i等于:0
i等于:0
i等于:1 j等于:0
这道题让我困惑了很久,下面我们来分析一下,执行第一句的时候,由于java中基本数据类型是值传递,传递的是实参的副本,所以实参i的值不变。
当执行到第二句时,注意++的优先级高于赋值=,所以先执行i++操作,再进行赋值。参考其他网友的说法,java语言规范里对于++是这样说的:The result of the postfix increment expression is not a variable, but a value.即:++表达式结果是个值,而不是变量。
JVM里面有两个存储区:一个是临时暂存区,一个是变量区,JVM运行第二句的时候,分为三步:
1、把i的值0保存到临时暂存区,临时暂存区为0,变量区的值也为0
2、把i的值加1,这时候i=1,此时临时暂存区的值为0,变量区的变成值为1,
3、由于++表达式的结果是个值,不是变量,所以i++运行完后的值就应该从暂存区去取,暂存区存的是0,把临时暂存区的值0返回给i,所以i=0;
注意此时i=0
当执行第三句的时候。同理,i的值又重新开始保存,j的值是i保存到临时暂存区的值的,此时临时暂存区的值为0,所以j=0,而i的值是从i的变量区取的,i=1。
注意以上分析只对i=i++;j=i++;有效,不能用来分析i=++i; j=++i。