java foreach迴圈為什麼不能賦值
阿新 • • 發佈:2019-01-26
直接上程式碼
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中,從始至終的操作都是在本地區域性變數中的,並沒有對原來的數值產生任何影響。