Vòng lặp cho mỗi lần sẽ không hoạt động đối với trường hợp này. Bạn không thể sử dụng vòng lặp for-each để khởi tạo một mảng. Mã của bạn:
int[] array = new int[5];
for (int i : array) {
i = 24;
}
sẽ dịch một cái gì đó như sau:
int[] array = new int[5];
for (int j = 0; j < array.length; j++) {
int i = array[j];
i = 24;
}
Nếu đây là một mảng của các đối tượng, nó sẽ vẫn thất bại. Về cơ bản, mỗi lần gán mỗi mục trong bộ sưu tập hoặc mảng, lần lượt, đến biến mà bạn cung cấp, sau đó bạn có thể làm việc với. Biến là không phải tương đương với tham chiếu mảng. Nó chỉ là một biến.
for-each không thể được sử dụng để khởi bất kỳ mảng hoặc sưu tập, bởi vì nó vòng qua các nội dung hiện tại của mảng hoặc sưu tập, đem lại cho bạn mỗi giá trị cùng một lúc. Biến số cho mỗi đối tượng là không một proxy cho một mảng hoặc tham chiếu Bộ sưu tập. Trình biên dịch không thay thế "i
" của bạn (từ "int i
") bằng "array[index]
".
Nếu bạn có một mảng của ngày, ví dụ, và cố gắng này, mã:
Date[] array = new Date[5];
for (Date d : array) {
d = new Date();
}
sẽ được dịch sang một cái gì đó như thế này:
Date[] array = new Date[5];
for (int i = 0; i < array.length; i++) {
Date d = array[i];
d = new Date();
}
mà như bạn có thể nhìn thấy sẽ không khởi tạo mảng. Bạn sẽ kết thúc với một mảng chứa tất cả các giá trị rỗng.
LƯU Ý: Tôi đã lấy mã ở trên, biên dịch thành một tệp .class
và sau đó sử dụng jad để dịch ngược nó. Quá trình này cung cấp cho tôi mã sau đây, được tạo ra bởi trình biên dịch Java của Sun (1.6) từ đoạn code trên:
int array[] = new int[5];
int ai[];
int k = (ai = array).length;
for(int j = 0; j < k; j++)
{
int i = ai[j];
i = 5;
}
Không phải câu hỏi khác là trùng lặp? Đây là lần đầu tiên. – masher