java foreach循环为什么不能赋值

直接上代码

public class test4 {
    public static void main(String args[]){
        int [] a=new int[3];
        for(int j:a){
            j=55;
        }
    }
}

代码很简单,下面是java编译后的字节码:

public class test4 {
  public test4();
    Code:
       0: aload_0
       1: invokespecial #8                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: iconst_3          //将int型3推送至栈顶
       1: newarray       int        //创建一个指定原始类型的数组,并将其引用值压入栈顶
       3: astore_1          //将栈顶引用型数值存入第二个本地变量
       4: aload_1           //将第二个引用类型本地变量推送至栈顶
       5: dup               //复制栈顶数值并将复制值压入栈顶
       6: astore        5       //将栈顶引用型数值存入指定本地变量,此处将数组引用放在第六个本地变量里
       8: arraylength           //获得数组的长度值并压入栈顶
       9: istore        4       //将栈顶int型数值存入指定本地变量。
      11: iconst_0          //将int型0推送至栈顶
      12: istore_3          //将栈顶int型数值存入第四个本地变量
      13: goto          27      //跳转到27
      16: aload         5       //将指定的引用类型本地变量推送至栈顶
      18: iload_3           //将第四个int型本地变量推送值栈顶
      19: iaload            //将int型数组指定索引的值推送至栈顶    
      20: istore_2          //将栈顶int型数值存入第三个本地变量
      21: bipush        55      //将单字节的常量值(-127~128)推送至栈顶
      23: istore_2          //将栈顶int型数值存入第三个本地变量
      24: iinc          3, 1        //将指定int型变量增加指定值
      27: iload_3           //将第四个int型本地变量推送至栈顶
      28: iload         4       //将指定的int型本地变量推送至栈顶
      30: if_icmplt     16      //比较栈顶两int型数值的大小,当结果小小于0时跳转
      33: return            //从当前方法返回void
}

我们只需要关注6,16~23行就可以,可以发现这几句代码是将数组引用副本中的值取出放在栈顶,然后从栈顶取出变量放在本地变量3中,然后把55放在栈顶,再把55取出放在本地变量3中,从始至终的操作都是在本地局部变量中的,并没有对原来的数值产生任何影响。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值