標籤:foreach java
直接上代碼
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中,從始至終的操作都是在本地局部變數中的,並沒有對原來的數值產生任何影響。
java foreach迴圈為什麼不能賦值