我了解到,当您在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。
如果您修改s1
,s2
也会被修改(因为它指向同一对象)。
基本类型有一个例外:int, double, float, boolean, char, byte, short, long
。它们按值存储。因此,在使用时=
,您仅分配值,但它们不能指向同一对象(因为它们不是引用)。这意味着
int b = a;
仅将的值设置b
为的值a
。 如果您更改a
,b
则不会更改。
归根结底,一切都是按值分配,它只是引用的值,而不是对象的值(如上所述的原始类型除外)。
因此,在您的情况下,如果要复制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()复制对象还是对对象的引用? 参考,这是一个 浅表 副本。出乎意料的是,文档没有明确地说,只是隐式地说,因为他们 只 谈论复制数组元素,而不是递归地复制他们引用的