Czy ktoś może wyjaśnić, co się tutaj dzieje. Miałem wrażenie, że rozmiar tablicy nie może zostać zmieniony po jej utworzeniu i zadeklarowaniu.
public class ArrayManipulation
{
public static void main(String[] args)
{
int a[] = {1, 2, 3};//new int[3];
int b[] = new int[a.length-1];
System.out.print("a = ");
for (int i = 0; i < a.length; i++)
System.out.print(a[i] + " ");
System.out.println();
for (int i = 0; i < b.length; i++)
b[i] = a[i];
//This is the bit I am confused about.. I was expecting an error here
a = b;
System.out.print("a = ");
for (int i = 0; i < a.length; i++)
System.out.print(a[i] + " ");
System.out.println();
}
}
Odpowiedzi:
6 dla odpowiedzi № 1Tablice są obiektami i tak, po ich utworzeniu ich rozmiar się nie zmienia.
w linii:
a= b;
wskazujesz a
odniesienie do b
obiekt. Więc twój pierwszy przedmiot to a
odwołanie jest nadal w maszynie wirtualnej, dopóki nie zostaną zebrane śmieci.
Ale rozmiar twojej tablicy nie zmienił się, ale teraz odwołujesz się do tablicy / obiektu differet
0 dla odpowiedzi nr 2
Obie a
i b
są rodzaju int[]
. Więc a = b
po prostu przypisz wartość a
do wartości b
.
Po tym zadaniu oboje a
i b
odnoszą się do tej samej tablicy i początkowej tablicy, do której odwołuje się a
mogą być zbierane przez zbieracz śmieci ponieważ nie jest już dostępny.
0 dla odpowiedzi № 3
Zmieniasz to odwołanie a
wskazuje na kiedy mówisz a = b
.
Ponieważ tablice są obiektami, ustawienie jednego równego drugiemu zmienia odniesienie. Obie tablice nadal istnieją, ale obie referencje - a
i b
- wskaż lokalizację b
. Jedyny sposób na usunięcie tablicy a
to zbierać śmieci.
W rzeczywistości nie zmieniasz rozmiaru tablicy, wygląda na to.
0 dla odpowiedzi nr 4
//This is the bit I am confused about.. I was expecting an error here
a = b;
Tak, jesteś zmieszany z właściwą rzeczą! a
i b
mieć przydzieloną własną pamięć. Z a = b
robisz a
wskaż pamięć przydzieloną do b
.
Być może dodanie tych dodatkowych sysouts do kodu pomoże, zobacz wyjście:
public class ArrayManipulation
{
public static void main(String[] args)
{
int a[] = {1, 2, 3};//new int[3];
int b[] = new int[a.length-1];
System.out.print("a = ");
for (int i = 0; i < a.length; i++)
System.out.print(a[i] + " ");
System.out.println();
for (int i = 0; i < b.length; i++)
b[i] = a[i];
System.out.print("NEW -- before a=b. a = " + a);
System.out.print("NEW -- before a=b. b = " + b);
//This is the bit I am confused about.. I was expecting an error here
a = b;
System.out.print("NEW -- after a=b. a = " + a);
System.out.print("NEW -- after a=b. b = " + b);
System.out.print("a = ");
for (int i = 0; i < a.length; i++)
System.out.print(a[i] + " ");
System.out.println();
}
}