1. 程式人生 > >java foreach迴圈為什麼不能賦值

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中,從始至終的操作都是在本地區域性變數中的,並沒有對原來的數值產生任何影響。