Если массивы являются объектами в Java, почему назначение между массивами является глубоким копированием

Если массивы являются объектами, как указано в разделе Является ли массив объектами в Java, то почему вывод кода, приведенного ниже, равен [1,1,1]?

Я думал после выполнения заявления "а = б;" a и b все еще указывают на один и тот же контент! Разве это не должно быть теневой копией между объектами?

import java.util.Arrays;

public class Local {
    int [] a = null;
    public Local(){
    int [] b = {1,1,1};
    int [] c = {5,5};
    a=b;
    b=c;// 'a' should change too as a and b are both objects! right?
    }

    public static void main(String[] args) {
        Local local = new Local();
        System.out.println(Arrays.toString(local.a));
    }

}

3 ответа

Решение

Позвольте мне попытаться объяснить это строка за строкой:

int [] b = {1,1,1};

введите описание изображения здесь

На этой линии произошло три вещи.

  1. Создана переменная с именем b,
  2. Создан массив int{1,1,1}
  3. назначенный b к массиву int создан на шаге 2.

int [] c = {5,5};

введите описание изображения здесь

То же самое произошло здесь

  1. Создана переменная с именем c,
  2. Создан массив int{5,5}
  3. назначенный c к массиву int создан на шаге 2.

a=b;

Теперь мы также назначены a какой бы ни была ценность b есть, который в данном случае является массивом int{1,1,1}

Теперь у нас есть что-то вроде

введите описание изображения здесь

b=c; // 'a' should change too as a and b are both objects! right?

То, что произошло здесь, это то, что мы назначили b к чему угодно c значение int массив {5,5}), сейчас b не указывает на {1,1,1} больше и так как Java передается по значению, a Ценность осталась. Это не как a указывает на ссылку b что бы ни b указывает на, a будет указывать на это тоже.

введите описание изображения здесь

Надеюсь это поможет.

// 'a' should change too as a and b are both objects! right?

Нет обоих a а также b просто ссылочные переменные, указывающие на один и тот же объект массива {1,1,1},

С помощью строки ниже вы делаете b ссылаться на совершенно другой объект массива, где как a все равно будет указывать на тот же объект массива {1,1,1} как ссылка только b но нет a изменяется путем выполнения строки ниже

b = new int[] {2, 2};

Также делая a = b вы заставляете их указывать на один объект массива {1,1,1} и здесь не происходит глубокая / мелкая копия.

Переменная a не будет автоматически обновляться. в основном потому что

b = c //is like b = new int[]{5,5};

это та же концепция в вашем вопросе ранее с

b = new int[]{2,2,2};

a указывает на b's массив int, который равен [1,1,1]

и вы говорите b указать на c который [5,5]

a => b's array
b => c's array

так a сохранит свой объект и b будет новый.

Сначала b указывает на объект массива {1,1,1}и вы назначаете b к, так a указывает на {1,1,1}так что выход {1,1,1}

Другие вопросы по тегам