Java 数组赋值运算问题

Java 数组赋值运算问题,java,Java,如果我有这样一段代码: MyClass[] objArray = new MyClass[7]; //assign values to objArray //do something here //sometime later MyClass newObj = new MyClass(); objArray[3] = newObj; 上面的最后一句话将执行以下操作: 将newObj的所有内容复制到objArray[3]引用的空间 问题 我说得对吗 浅拷贝还是深拷贝 如果是浅拷贝,我如何使深

如果我有这样一段代码:

MyClass[] objArray = new MyClass[7];
//assign values to objArray
//do something here
//sometime later
MyClass newObj = new MyClass();
objArray[3] = newObj;
上面的最后一句话将执行以下操作:

  • newObj
    的所有内容复制到objArray[3]引用的空间
问题
  • 我说得对吗

  • 浅拷贝还是深拷贝

  • 如果是浅拷贝,我如何使深拷贝成为可能

    objArray[3] = newObj; 
    
  • 此规则是否适用于其他Java容器类型,如队列、列表等

  • 将newObj的所有内容复制到 objArray[3]引用的空间

    不,它将在objArray[3]中存储对[引用对象:Thank Jon Skeet]newObj的引用。原始对象不会以任何方式更改或复制,只是对它的引用

    将newObj的所有内容复制到 objArray[3]引用的空间


    不,它将在objArray[3]中存储对[引用对象:Thank Jon Skeet]newObj的引用。原始对象不会以任何方式被更改或复制,只是对它的引用。

    完全没有复制。对象的引用在数组中设置。

    完全没有副本。在数组中设置对对象的引用

  • 不,它不复制内容。它只是创建了另一个引用
  • 肤浅的。(见1)
  • 如果需要深度复制,则不能使用该语句。您必须在类
    MyClass
    中重写java.lang.Object的克隆方法,并使用该方法或创建复制构造函数
  • 它适用于所有不是像int或double这样的原语的数据类型
  • 不,它不复制内容。它只是创建了另一个引用
  • 肤浅的。(见1)
  • 如果需要深度复制,则不能使用该语句。您必须在类
    MyClass
    中重写java.lang.Object的克隆方法,并使用该方法或创建复制构造函数
  • 它适用于所有不是像int或double这样的原语的数据类型 那么,它会将“newObj的所有内容”复制到objArray[3]但是
    newObj
    变量的内容(或值)只是对对象的引用。换言之,考虑:

    objArray[3] = newObj;
    newObj.setFoo("hello");
    
    System.out.println(objArray[3].getFoo()); // prints "hello"
    
    (当然,假设一个简单的属性)

    基本上,变量(包括数组元素)的值永远不是对象。它始终是一个引用或基本值。它总是按值传递或复制。

    好吧,它会将“newObj的所有内容”复制到
    objArray[3]
    但是
    newObj
    变量的内容(或值)只是对对象的引用。换言之,考虑:

    objArray[3] = newObj;
    newObj.setFoo("hello");
    
    System.out.println(objArray[3].getFoo()); // prints "hello"
    
    (当然,假设一个简单的属性)


    基本上,变量(包括数组元素)的值永远不是对象。它始终是一个引用或基本值。它总是按值传递或复制。

    回答1和2:否。仅复制对对象的引用
    newObj
    objArray[3]
    随后将引用同一对象实例

    回答3:如果你想要一个副本,你必须自己实现它。您可以实现一个复制构造函数或
    Clonable
    ,或者对于一个简单的深度复制,序列化和反序列化对象,但这要求它及其组成的所有对象都是
    可序列化的


    回答4:对于所有Java对象来说都是一样的:代码驻留在堆上,代码只在引用对象时工作。容器类型通常实现执行浅层复制的复制构造函数。没有可自动用于所有类的深度复制功能。

    答案1和2:否。仅复制对对象的引用
    newObj
    objArray[3]
    随后将引用同一对象实例

    回答3:如果你想要一个副本,你必须自己实现它。您可以实现一个复制构造函数或
    Clonable
    ,或者对于一个简单的深度复制,序列化和反序列化对象,但这要求它及其组成的所有对象都是
    可序列化的


    回答4:对于所有Java对象来说都是一样的:代码驻留在堆上,代码只在引用对象时工作。容器类型通常实现执行浅层复制的复制构造函数。没有可自动用于所有类的深度复制功能。

    请注意,
    newObj
    不是一个对象,而是一个变量。区分两者很重要,因为给
    newObj
    一个新值根本不会改变数组中的内容。请注意
    newObj
    不是一个对象,而是一个变量。区分这两者很重要,因为给
    newObj
    一个新值根本不会改变数组中的内容。没有对象的副本,只有引用。没有对象的副本,只有引用。这是一个很好的示例,可以说明数组如何引用对象!演示数组如何引用对象的好例子!