Java之使用中间缓存变量机制
2016-08-17 12:15
267 查看
今天在刷题时遇到这么一道题,程序代码如下:
此程序运行的结果是:0。这个结果令我非常困惑,令我困惑的问题有两个:
为什么调用fermin函数后,不影响i的值?
i=i++;i的值为什么是0?
关于第一个问题的解答如下:
java方法之间的参数传递是值传递而不是引用传递
每个方法都会有一个栈帧,栈帧是方法运行时的数据结构。这就是说每个方法都有自己独享的局部变量表。(更严谨的说法其实是每个线程在执行每个方法时都有自己的栈帧,或者叫当前栈帧 current stack frame)
被调用方法fermin()的形式参数int i 实际上是调用方法main()的实际参数 i 的一个副本。
方法之间的参数传递是通过局部变量表实现的,main()方法调用fermin()方法时,传递了2个参数:
第0个隐式参数是当前实例(Inc inc = new Inc(); 就是inc引用的副本,引用/reference 是指向对象的一个地址,32位系统这个地址占用4个字节,也就是用一个Slot来保存对象reference,这里传递的实际上是reference的一个副本而不是 reference本身 );
第1个显示参数是 i 的一个副本。所以 fermin()方法对 i 执行的操作只限定在其方法独享或可见的局部变量表这个范围内,main()方法中局部变量表中的i不受它的影响;
如果main()方法和fermin()方法共享局部变量表的话,那答案的结果就会有所不同。
关于第二个问题的解答如下:
Java使用了中间缓存变量机制:
i=i++;等同于:i++是先将i赋值,然后再自增
temp=i; (等号右边的i)
i=i+1; (等号右边的i)
i=temp; (等号左边的i)
而i=++i;则等同于:
i=i+1;
temp=i;
i=temp;
故调用fermin函数不会影响i的值,所以i=0,然后公式i=i++;i的值依然是0,所以程序运行的结果是0。
本人水平有限以上解释如有错误,欢迎指出,以便修改。
package algorithms.com.guan.javajicu; public class Inc { public static void main(String[] args) { Inc inc = new Inc(); int i = 0; inc.fermin(i); i= i ++; System.out.println(i); } void fermin(int i){ i++; } }
此程序运行的结果是:0。这个结果令我非常困惑,令我困惑的问题有两个:
为什么调用fermin函数后,不影响i的值?
i=i++;i的值为什么是0?
关于第一个问题的解答如下:
java方法之间的参数传递是值传递而不是引用传递
每个方法都会有一个栈帧,栈帧是方法运行时的数据结构。这就是说每个方法都有自己独享的局部变量表。(更严谨的说法其实是每个线程在执行每个方法时都有自己的栈帧,或者叫当前栈帧 current stack frame)
被调用方法fermin()的形式参数int i 实际上是调用方法main()的实际参数 i 的一个副本。
方法之间的参数传递是通过局部变量表实现的,main()方法调用fermin()方法时,传递了2个参数:
第0个隐式参数是当前实例(Inc inc = new Inc(); 就是inc引用的副本,引用/reference 是指向对象的一个地址,32位系统这个地址占用4个字节,也就是用一个Slot来保存对象reference,这里传递的实际上是reference的一个副本而不是 reference本身 );
第1个显示参数是 i 的一个副本。所以 fermin()方法对 i 执行的操作只限定在其方法独享或可见的局部变量表这个范围内,main()方法中局部变量表中的i不受它的影响;
如果main()方法和fermin()方法共享局部变量表的话,那答案的结果就会有所不同。
关于第二个问题的解答如下:
Java使用了中间缓存变量机制:
i=i++;等同于:i++是先将i赋值,然后再自增
temp=i; (等号右边的i)
i=i+1; (等号右边的i)
i=temp; (等号左边的i)
而i=++i;则等同于:
i=i+1;
temp=i;
i=temp;
故调用fermin函数不会影响i的值,所以i=0,然后公式i=i++;i的值依然是0,所以程序运行的结果是0。
本人水平有限以上解释如有错误,欢迎指出,以便修改。
相关文章推荐
- Java的中间缓存变量机制
- Java中间缓存变量机制
- Java中间缓存变量机制
- Java中的自增操作符与中间缓存变量机制
- Java中的自增操作符与中间缓存变量机制
- 【java学习笔记】java中的中间缓存变量机制
- Java中间变量缓存机制
- java中间缓存变量机制
- java 中间缓存变量机制
- Java中的中间缓存变量机制
- Java中间缓存变量机制
- 我爱学Java之中间缓存变量机制
- 关于java的自增操作符与中间缓存变量机制
- Java的中间缓存变量机制与自增操作符
- Java中的自增操作符与中间缓存变量机制
- java二维数组递增赋值与java中间变量缓存机制
- Java中的自增操作符与中间缓存变量机制
- 浅谈Java中间缓存变量机制
- 基于字节码指令理解Java中间缓存变量机制
- Java中间变量缓存机制