Modyfikowanie tablicy przekazanej jako parametr metody


Załóżmy, że mam tablicę int i chcę ją zmodyfikować. Wiem, że nie mogę przypisać nowej tablicy do tablicy przekazanej jako parametr:
public static void main(String[] args)
{
int[] temp_array = {1};
method(temp_array);
System.out.println(temp_array[0]);// prints 1
}
public static void method(int[] n)
{
n = new int[]{2};
}

podczas gdy mogę to zmodyfikować:
public static void main(String[] args)
{
int[] temp_array = {1};
method(temp_array);
System.out.println(temp_array[0]);// prints 2
}
public static void method(int[] n)
{
n[0] = 2;
}

Następnie próbowałem przypisać dowolną tablicę do tablicy przekazanej jako parametr za pomocą
clone ()
:
public static void main(String[] args)
{
int[] temp_array = {1};
method(temp_array);
System.out.println(temp_array[0]);// prints 1 ?!
}
public static void method(int[] n)
{
int[] temp = new int[]{2};
n = temp.clone();
}

Teraz zastanawiam się, dlaczego w ostatnim przykładzie wypisuje 1, podczas gdy po prostu kopiuję tablicę za pomocą
clone ()
, która po prostu kopiuje wartość, a nie referencję. Czy mógłbyś mi to wyjaśnić?

EDIT:

czy istnieje sposób na skopiowanie tablicy do obiektu bez zmiany odniesienia? Mam zamiar zrobić ostatni przykład drukowania
2
.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

W twojej metodzie
public static void method(int[] n)

n
to inna nazwa tablicy przekazanej w ten sposób. Wskazuje na to samo miejsce w pamięci, co oryginał, czyli tablicę liczb całkowitych. Jeśli zmienisz jedną z wartości przechowywanych w tej tablicy, wszystkie nazwy wskazujące na nią zobaczą zmianę.
Jednak w samej metodzie
public static void method(int[] n) {
int[] temp = new int[]{2};
n = temp.clone();
}

Tworzysz nową tablicę, a następnie mówisz: „nazwa 'n' wskazuje teraz na tę drugą tablicę, a nie tę, która została przekazana”. Zasadniczo nazwa „n” nie jest już nazwą przekazanej tablicy.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Twoje przykłady 1 i 3 są prawie takie same w kontekście pytania - próbujesz przypisać nową wartość do
n
(która jest odniesieniem do tablicy przekazywanej przez wartość).
Fakt, że sklonowałeś tablicę
temp
nie ma znaczenia - wszystko, co zrobił, to utworzenie kopii
temp
, a następnie przypisanie jej do
n
. ..
Aby skopiować wartości do tablicy przekazanej do Twojej
metody
, możesz spojrzeć na:

System.arraycopy
http://download.oracle.com/jav ... bject,%20int,%20java.lang.Object,%20int,%20int%29
To wszystko oczywiście zależy od rozmiaru tablicy
n
i tej, którą utworzysz w ramach
metody
.
Załóżmy, że oba mają tę samą długość, na przykład zrobiłbyś to w ten sposób:
public static void main(String[] args)
{
int[] temp_array = {1};
method(temp_array);
System.out.println(temp_array[0]);
}
public static void method(int[] n)
{
int[] temp = new int[]{2};
System.arraycopy(temp, 0, n, 0, n.length);
// or System.arraycopy(temp, 0, n, 0, temp.length) -
// since we assumed that n and temp are of the same length
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jak poprawnie zauważyłeś, nie możesz przypisać odniesienia przekazanego jako parametr do tablicy. (Lub, dokładniej, przypisanie nie będzie miało wpływu na rozmówcę).
To najlepsza rzecz, jaką możesz zrobić:
public static void method(int[] n) {
int[] temp = new int[]{2};
for (int i = 0; i < temp.length; i++) {
n[i] = temp[i];
}
// ... or the equivalent using System.arraycopy(...) or some such
}

Oczywiście działa to poprawnie tylko wtedy, gdy rozmiar tablicy wejściowej jest taki sam, jak rozmiar tablicy, do której kopiujesz. (Sposób, w jaki należy sobie z tym poradzić, zależy od konkretnej aplikacji ...)
Podczas pisania Java przekazuje referencję do tablicy według wartości. Nie przekazuje zawartości tablicy według wartości. A klon nie pomoże rozwiązać tego problemu. (Przynajmniej nie z zadeklarowaną sygnaturą metody).
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

W Twojej
metodzie
nic, co przypiszesz do
n
, nigdy nie zmieni wartości obiektu przekazanego i przypisanego do
n
. Na początku
method
n
wskazuje na tablicę. Kiedy przypiszesz
n
, aby był równy innej tablicy, po prostu ponownie określ, która tablica
n
wskazuje, i nie zmieniaj niczego w
temp_array
z <code method=""> main[/code].

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się