代码之家  ›  专栏  ›  技术社区  ›  C graphics

如果数组是java中的对象,为什么数组之间的赋值是深度拷贝

  •  0
  • C graphics  · 技术社区  · 10 年前

    如果数组是中所述的对象 Is an array an object in java 那么为什么下面截取的代码的输出是[1,1,1]?

    我认为在执行语句“a=b;”之后,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));
        }
    
    }
    
    4 回复  |  直到 7 年前
        1
  •  3
  •   lxcky    10 年前

    让我逐行解释一下:

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

    enter image description here

    在这条线上,发生了三件事。

    1. 创建了名为的变量 b .
    2. 创建了一个数组 int {1,1,1}
    3. 分配 b 整数 在步骤2创建。

    int [] c = {5,5};

    enter image description here

    这里也发生了同样的事情

    1. 创建了名为的变量 c .
    2. 创建了一个数组 整数 {5,5}
    3. 分配 c 整数 在步骤2创建。

    a=b;

    现在我们还分配了 a 无论 价值 属于 b 是,在本例中是 整数 {1,1,1}

    现在我们有了类似的东西

    enter image description here

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

    这里发生的是我们分配的 b 不管怎样 c 价值 是( 整数 大堆 {5,5} ),现在 b 未指向 {1,1,1} 因为Java是 传递值 , 价值仍然存在。这不像 指向 参考 属于 b 不管怎样 b 指向, 也会指向它。

    enter image description here

    希望这有帮助。

        2
  •  3
  •   Manjunath    10 年前
    // 'a' should change too as a and b are both objects! right?
    

    两者都没有 a b 只是指向同一数组对象的引用变量 {1,1,1} .

    下面是您正在制作的线条 b 引用完全不同的数组对象,其中 将仍然指向相同的数组对象 {1,1,1} 仅供参考 b 但不是 通过执行以下行进行更改

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

    也通过制作 a = b 您正在使它们指向一个数组对象 {1,1,1} 这里没有深度/浅层复制。

        3
  •  1
  •   Ker p pag    10 年前

    变量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
    

    所以 将保留其对象 b 将有一个新的。

        4
  •  0
  •   wangyuxiang    5 年前

    首先,b指向数组对象 {1,1,1} 然后你分配 b 到a,所以 a 指向 {1,1,1} 所以输出是{1,1,1}