java局部变量,中间缓存

此程序运行的结果是:0。这个结果令我非常困惑,令我困惑的问题有两个:

  1. 为什么调用fermin函数后,不影响i的值?
  2. i=i++;i的值为什么是0?

关于第一个问题的解答如下:

  1. java方法之间的参数传递是值传递而不是引用传递
  2. 每个方法都会有一个栈帧,栈帧是方法运行时的数据结构。这就是说每个方法都有自己独享的局部变量表。(更严谨的说法其实是每个线程在执行每个方法时都有自己的栈帧,或者叫当前栈帧 current stack frame)
  3. 被调用方法fermin()的形式参数int i 实际上是调用方法main()的实际参数 i 的一个副本。
  4. 方法之间的参数传递是通过局部变量表实现的,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。

那么再来研究一下关前加加和后加加的问题:将i = i++; 替换成:i = ++ i; 来看下面的运行结果:

那么此时对i++成功,结果变成了1;

再换一种方式,直接改为i++;

此时的结果也变成了1;

所以此时问题很明显是前加加还是后加加的问题。下一篇文章来讨论这个问题。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值