nie jestem faktycznie w stanie replikować zachowanie już wspomniałem. Widzę kilka odpowiedzi, w których płytka kopia jest główną przyczyną problemu. Popraw mnie, jeśli się mylę, płytka kopia oznacza po prostu, że zamiast kopiowania obiektu podczas klonowania otrzymamy kopię odniesienia.Dobre wyjaśnienie można znaleźć tutaj: In Java, what is a shallow copy?
W tym przypadku płytka kopia upewni się tylko, że zmiany w oryginalnej tablicy zostaną odzwierciedlone w klonowanej tablicy, ale nie powstrzymają niczego przed skopiowaniem.
int[][] array = new int[][] {{1,2,3},{4,5,6}, {7,8,9}};
int[][] clone = array.clone();
//Try this to see magic of shallow copy
//array[2][1]=11;
for(int i=0;i<array.length;i++)
for(int j=0;j<array[i].length;j++)
System.out.println("array["+i+"]["+j+"]"+array[i][j]);
for(int i=0;i<clone.length;i++)
for(int j=0;j<clone[i].length;j++)
System.out.println("clone["+i+"]["+j+"]"+clone[i][j]);
Klonowanie odbywa się idealnie, ponieważ obie tablice mają tę samą zawartość. Jedynym powodem, dla którego mogę myśleć o problemie z klonowaną tablicą, nie jest informacja, że zmodyfikowaliśmy oryginalną tablicę po klonowaniu (płytka kopia wchodzi wtedy do gry).
BTW Użyłem Java 1.6, mam nadzieję, że to nie jest problem.
Edytuj: Po prostu musimy zrozumieć, dlaczego ich płytka kopia zamiast głębokiej kopii tablicy wielowymiarowej. Przyjrzyjmy się 2 faktom:
- Podczas klonowania Obiekty są zawsze klonowane jako płytka kopia (kopia odniesienia obiektu), tylko typy natywne otrzymują prawdziwą kopię. In Java, what is a shallow copy?
- tablicy w Java jest rzeczywiście przedmiotem Is an array an object in java
Teraz połączenie 1 i 2, wiemy, że wielowymiarowa tablica w języku Java jest tylko przedmiotem, który ma odniesienie do innych obiektów tablicy.
Coś takiego jak ArrayObj -> {ArrayObj, ArrayObj, ArrayObj};
A ponieważ mamy Obiekty wewnątrz obiektów (kompozycja), mamy otrzymać płytką kopię zgodnie z regułą klonowania Javy.
Ja wyjaśnię. Klonowanie rzeczywiście się zdarzyło, ale nie jest głębokie. – Bozho