請先看代碼:
static List intArrayAsList(final int[] a) {
return new AbstractList() {
public Object get(int i) {
return new Integer(a[i]);
}
public int size() {
return a.length;
}
public Object set(int i, Object o) {
int oldVal = a[i];
a[i] = ((Integer)o).intValue();
return new Integer(oldVal);
}
};
}
public static void main(String[] args) {
int[] a = {0, 1};
List l = intArrayAsList(a);
int b = (int)l.get(0);
}
我的問題在於:當intArrayAsList方法結束時,方法入參不是生命周期就結束了嗎?而且在new AbstractList時,也並沒有把方法入參傳給AbstractList的instance裡去。那麼當調用l.get()時,到底是從哪裡得到的數據?
求詳解這部分知識。
匿名內部類在編譯時會生成一個普通的類,這樣就可以保證該類在方法結束後依然可以使用,傳入的final參數會成為該類的某個字段的拷貝,比如你這裡傳入的是int類型的數組,那麼在編譯後生成的類中也會有一個類似
final int[]b 的成員,該成員的值就是你傳入的a的值。這樣保證了當你調用匿名內部類的方法時,能夠獲取到外部傳入的參數值。