当前位置: 首页 > 面试题库 >

用Java复制对象

季森
2023-03-14
问题内容

我了解到,当您在Java中修改变量时,它不会更改它所基于的变量

int a = new Integer(5);
int b = a;
b = b + b;
System.out.println(a); // 5 as expected
System.out.println(b); // 10 as expected

我为对象假设了类似的事情。考虑这个课程。

public class SomeObject {
    public String text;

    public SomeObject(String text) {
        this.setText(text);
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
}

在尝试了这段代码后,我感到困惑。

SomeObject s1 = new SomeObject("first");
SomeObject s2 = s1;
s2.setText("second");
System.out.println(s1.getText()); // second as UNexpected
System.out.println(s2.getText()); // second as expected

请向我解释为什么更改任何一个对象都会影响另一个对象。我知道变量文本的值存储在两个对象的内存中的相同位置。

为什么变量的值是独立的却与对象相关?

另外,如果简单分配不能完成工作,如何复制SomeObject?


问题答案:

Java中的每个变量都是一个 引用 。所以当你这样做

SomeClass s2 = s1;

您只是指向s2与指向相同的对象s1。您实际上是在将引用s1的值(指向的一个实例SomeClass)分配给s2。
如果您修改s1s2也会被修改(因为它指向同一对象)。

基本类型有一个例外:int, double, float, boolean, char, byte, short, long。它们按值存储。因此,在使用时=,您仅分配值,但它们不能指向同一对象(因为它们不是引用)。这意味着

int b = a;

仅将的值设置b为的值a如果您更改ab则不会更改。

归根结底,一切都是按值分配,它只是引用的值,而不是对象的值(如上所述的原始类型除外)。

因此,在您的情况下,如果要复制s1,可以这样进行:

SomeClass s1 = new SomeClass("first");
SomeClass s2 = new SomeClass(s1.getText());

或者,您可以向其添加一个复制构造函数,SomeClass该复制构造函数将实例作为参数并将其复制到自己的实例中。

class SomeClass {
  private String text;
  // all your fields and methods go here

  public SomeClass(SomeClass copyInstance) {
    this.text = new String(copyInstance.text);
  }
}

这样,您可以轻松复制对象

SomeClass s2 = new SomeClass(s1);


 类似资料:
  • 我了解到,当您在Java中修改变量时,它不会改变它所基于的变量 我对对象也假设了类似的情况。考虑一下这个类。 在我试过这个代码后,我搞糊涂了。

  • 与原始类型相比,对象的根本区别之一是对象是“通过引用”被存储和复制的,与原始类型值相反:字符串,数字,布尔值等 —— 始终是以“整体值”的形式被复制的。 如果我们稍微看一下复制值时发生了什么,就很容易理解了。 让我们从原始类型开始,例如一个字符串。 这里我们将 message 复制到 phrase: let message = "Hello!"; let phrase = message; 结果我

  • 问题内容: 如何在Java中复制对象? 问题答案: 创建一个副本构造函数: 每个对象还有一个克隆方法,可用于复制对象,但不要使用它。创建类和执行不正确的克隆方法太容易了。

  • 通过拖动来复制对象 1选择一个或多个对象。 2选择 “选择 ”、 “直接选择 ”或 “编组选择 ”工具。 3按住 Alt 键 (Windows) 或 Option 键 (Mac OS) 并拖动所选对象(而非定界框上的手柄)。 使用图层面板复制对象 使用 “图层 ”面板可快速复制对象、组和整个图层。 1在 “图层 ”面板中选择要复制的项目。 2执行下列操作之一: 从 “图层 ”面板菜单中选择 “复制

  • 我很确定我以前做过这件事,所以我不知道为什么它现在会导致错误。这是我得到的错误: 它指向我定义新对象的位置,所以在静态上下文中不允许在方法调用中这样做吗?我需要定义一个变量并传入吗?因为那样会花更多的时间,而且会更加混乱。。。。 对于适当的上下文: 数组的类型为ArrayList Point是我定义的类。构造函数调用正确 p是Point的一个实例。它有两个字段:d0和d1(维度0和维度1,以减少与

  • 问题内容: 我正在上最后一堂课。我复制的阵列使用对象,并且当我改变一个中复制的数组对象,它就会被反映原始数组英寸 我正在输出, 我应该在所有情况下都得到25和26的输出,对吗?为什么会改变? 问题答案: System.arrayCopy()复制对象还是对对象的引用? 参考,这是一个 浅表 副本。出乎意料的是,文档没有明确地说,只是隐式地说,因为他们 只 谈论复制数组元素,而不是递归地复制他们引用的