Se avete mai usato C o C++ e sapere su come puntatori lavoro, allora ciò che ha reso questo intero scenario tick per me è la seguente dichiarazione:
In Java, everything is passed by value.
In case of Objects, the reference (pointer) is passed by value.
Quindi, in pratica la funzione di scambio di
public void swap(int[] a, int[] b)
{
etc.
}
Otterrà solo il puntatore all'array int [] a
e il puntatore all'array int [] b
. Stai solo scambiando due puntatori. Non è possibile modificare il contenuto di puntatori del genere.
Fondamentalmente la C equivalente è
void swap(int* a, int* b)
{
int* temp = a;
a = b;
b = temp;
}
int main(void)
{
int a[] = {5,6,7,8};
int b[] = {1,2,3,4};
swap(a,b);
}
Mentre anche in C, questo dovrebbe funzionare solo in questo modo:
void swap(int** a, int** b)
{
int* temp = (*a);
(*a) = (*b);
(*b) = temp;
}
int main(void)
{
int a[] = {5,6,7,8};
int b[] = {1,2,3,4};
swap(&a, &b);
}
Naturalmente, non è possibile inviare il riferimento di un riferimento in Java . Puntatori in questo senso non esistono in Java.
Pertanto, per modificare effettivamente l'oggetto in un'altra funzione, è necessario un oggetto "Titolare" al quale viene copiato il riferimento, ma il riferimento al suo interno all'oggetto che si desidera modificare è in realtà il riferimento effettivo di l'oggetto, se avesse senso.
E così, la seguente avrebbe funzionato:
public class ArrayHolder
{
public int[] array;
public ArrayHolder(int[] array)
{
this.array = array;
}
}
public void swap(ArrayHolder a, ArrayHolder b)
{
int[] temp = a.array;
a.array = b.array;
b.array = temp;
}
public static void main(String[] args)
{
ArrayHolder aaa = new ArrayHolder(new int[] {5,6,7,8});
ArrayHolder bbb = new ArrayHolder(new int[] {1,2,3,4});
swap(aaa,bbb);
}
È necessario comprendere i riferimenti. –
possibile duplicato di [È Java "pass-by-reference" o "pass-by-value"?] (Http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass -by-value) – vaxquis
Java passa ** riferimenti ** per valore. –