2016-03-20 15 views
5

Nie rozumiem, dlaczego nie mogę przypisać wartości elementom tablicy za pomocą ulepszonej pętli for. Na przykład za pomocą pętli for jak tenUlepszona pętla nie działa przy przypisywaniu wartości do tablicy (Java)

int[] array = new int[5]; 
    for(int i = 0; i < 5; i++) 
     array[i] = 10; 

produkuje to, co chcę. Ale dlaczego to nie działa z „dla każdego”:

for(int element : array) 
     element = 10; 

Czy jest jakiś konkretny powód, dlaczego tak jest czy robię coś źle?

Odpowiedz

8

W ulepszonej pętli for element jest lokalną zmienną zawierającą odwołanie (lub wartość w przypadku prymitywów) do bieżącego elementu tablicy lub Iterable, której dotyczy iteracja.

Przypisanie do niego nie ma wpływu na tablicę/Iterable.

To odpowiednik:

int[] array = new int[5]; 
for(int i = 0; i < 5; i++) { 
    int element = array[i]; 
    element = 10; 
} 

który również nie będą modyfikować tablicę.

Aby zmodyfikować tablicę, należy użyć zwykłej pętli for.

0

Udoskonalony pętli użyć:

for(int element : array) 
    element = 10; 
  1. w Javie mamy odnośniki odwołujące się do obiektu. W pewnym momencie jedno odniesienie może odnosić się tylko do jednego obiektu. Jeśli zostanie wykonany w celu odniesienia do innego obiektu, to traci odniesienie do poprzedniego. Podczas korzystania = następnie dokonać element odwołać innej wartości tj 10.

  2. Tutaj element jest type int, który jest primitive typu. Nawet jeśli byłby to Integer, a następnie Integer, to być immutable, nie byłby w stanie dokonać żadnych modyfikacji w obiekcie, ponieważ modyfikacje zawsze skutkowałyby oddzielnym obiektem.

Jeśli byłoby sprawę jak poniżej pewnej klasy niestandardowej powiedzieć Student.java jakiegoś List<Student> students.

for(Student std : students){ 
    std.setName("eureka"); 
} 

Teraz iteracji listę i drukowania nazwę każdego studenta miałby spowodowało druku eureka dla każdego ucznia. Należy jednak zauważyć, że nawet w tym przypadku użycie parametru = ponownie spowodowałoby uzyskanie takiego samego wyniku, jaki teraz uzyskujesz (ponieważ ponownie odwoływałbyś się do zmiennej do innego obiektu, nie odwoływałby się on już do oryginalnego obiektu na liście).

Powiązane problemy