2013-10-19 29 views
6

Khi tôi sử dụng bình thường đối với vòng lặp,
tất cả các yếu tố trong một mảng sẽ khởi tạo thông thường:Tại sao các phần tử mảng không được khởi tạo trong vòng lặp nâng cao?

Object[] objs = new Object[10]; 
for (int i=0;i<objs.length;i++) 
     objs[i] = new Object(); 


Nhưng khi tôi sử dụng một vòng lặp for-each.
các phần tử mảng vẫn còn null, sau khi vòng lặp:

Object[] objs = new Object[10]; 
for (Object obj : objs) 
     obj = new Object(); 


Tôi nghĩ obj đề cập đến một yếu tố đặc biệt trong một mảng,
vì vậy nếu tôi khởi tạo nó, phần tử mảng sẽ cũng được khởi tạo.
Tại sao điều đó không xảy ra?

Trả lời

10

Tôi nghĩ obj đề cập đến một phần tử cụ thể trong một mảng, vì vậy nếu tôi khởi tạo nó, phần tử mảng cũng sẽ được khởi tạo. Tại sao điều đó không xảy ra?

Không, objgiá trị của phần tử mảng vào lúc bắt đầu của cơ thể của vòng lặp. Đó không phải là bí danh cho biến phần tử mảng. Vì vậy, một vòng như thế này (đối với mảng, nó khác nhau cho iterables):

for (Object obj : objs) { 
    // Code using obj here 
} 

Tương đương với:

for (int i = 0; i < objs.length; i++) { 
    Object obj = objs[i]; 
    // Code using obj here 
} 

Xem section 14.14.2 of the JLS để biết thêm chi tiết về hành vi chính xác của tăng cường cho vòng lặp.

+0

Mục 14.14.2 không cho tôi biết gì về điều này nhưng câu trả lời của bạn rất rõ ràng, cảm ơn! –

+0

Chỉ cần kiểm tra, điều đó có nghĩa là các phương thức 'objs [i]' vẫn có thể được thực hiện thông qua 'obj' bằng cách thực hiện' obj.method() '? Vì 'obj' trỏ đến' objs [i] ' – SmRndGuy

+0

@SmRndGuy: Bạn có ý nghĩa gì bởi" phương pháp ... vẫn có thể được thực hiện "? Bạn vẫn có thể gọi các phương thức thông qua tham chiếu, nhưng nó sẽ không thay đổi nội dung của mảng. –

0

Bạn đang gán giá trị mới cho 'obj' chứ không phải là 'objs', do đó các phần tử là rỗng. Bạn cần phải gán giá trị cho objs thêm:

Object[] objs = new Object[10]; 
    for (int k = 0; k < objs.length; k++) { 
     objs[k] = new Object(); 
     System.out.println(objs[k]); 
    } 
1
Object[] objs = new Object[10]; 
for (Object obj : objs) 
    obj = new Object(); 

Bạn đã tạo gian nơi các đối tượng sẽ đi, nhưng bạn chưa thực sự tạo ra các đối tượng. Điều này sẽ cố gắng để lặp qua các đối tượng trong mảng nếu chúng tồn tại (mà họ làm chưa!)

Object[] objs = new Object[10]; 
for (int i=0; i < objs.length; i++) 
    objs[i] = new Object(); 

này là khác nhau do thực tế rằng bạn chỉ đơn giản là đếm từ 0 đến 9, và tạo + lưu trữ chúng ở vị trí thích hợp trong mảng.

+0

Câu trả lời của bạn không thực sự phù hợp với câu trả lời của Jon Skeet nếu tôi hiểu chính xác. –

+5

Anh ấy là Jon Skeet. Tôi không thể cạnh tranh với điều đó. – yamafontes

0

Bạn đang gán đối tượng mới cho phần tử mảng (Đó là biến sẽ là tham chiếu đến đối tượng) có thể được truy cập bên ngoài vòng lặp for.

Object[] objs = new Object[10]; 
for (int i=0;i<objs.length;i++) 
objs[i] = new Object(); 

Nhưng trong cho mỗi vòng bạn đang gán đối tượng mới vào biến cục bộ (không phần tử mảng)

Object[] objs = new Object[10]; 
for (Object obj : objs){ 
obj = new Object(); 
} 
//obj can not be accessed here 

và Nếu chúng ta nói về dòng này

 for (Object obj : objs){ 

Sau đó nó có nghĩa là bạn đang lấy giá trị của phần tử objs đến biến địa phương obj, là null.

Các vấn đề liên quan