在 java 中将一个对象初始化为另一个对象
Initialize one object to another in java
当我在 java 中将一个对象初始化为另一个对象时会发生什么?是在新对象中复制了该对象的引用,还是使用与原始对象中相同的成员值创建的新对象;
A obj1=new A("apple");
A obj2=obj1;
这个场景的正确解释是什么?
这只是复制的引用,而不是其他内存中的实际新对象 space。
通常对于 deep-copy
,您可以在 class 中声明自己的 clone
方法,该方法使用传递的对象的属性并使用 new
关键字创建另一个对象,并且returns它。这样,当您使用 clone
方法时,您将拥有一个新对象。更具体地说,您可以声明 class 来实现 Cloneable
接口,然后为父 Object
class 中已经存在的方法 clone()
提供覆盖实现。
对于 shallow-copy
你应该在你的 class 中再次创建一个 clone
方法,在这个方法中你可以只使用 return super.clone()
这样默认的 clone()
Object
class 提供的方法将用于创建对象的 shallow-copy
,这意味着只有原始字段将被实际复制,对于任何非原始字段,引用将被复制。
对于这个 class 中的字段只有一些 String
的简单示例,您可以使用 Object
[=38] 已经提供的 clone
的浅表副本=] 这似乎足够了。
但是,如果您在此 class 中有更多非原始字段,那么您将不得不 override
您的 clone
方法并提供一些实现,以便可以返回深层副本.
when I initialize one object to another in java
我不知道你所说的“对另一个人”是什么意思。但是你只初始化了一个对象。
第一行
关于你的第一行:
A obj1=new A("apple");
A obj1
声明了一个引用变量,给它起一个名字 obj1
,并指定这个变量将保存对任何类型 A
对象的引用。这个参考变量最初是 null.
调用new A("apple")
在内存中的某个地方构造一个对象。此代码的结果 return 值是对新对象的引用。
=
将该引用指定为名为 obj1
的变量的内容。
您可以将引用变量视为包含内存中该对象的已分配内存块的开头所在的地址。在 Java 中,我们永远看不到引用变量的文字内容。但是我们知道我们可以通过那个引用变量到达对象。
在我们日常的编程工作中Java,我们可能一般会认为obj1
是是对象。但实际上 obj1
是一种 找到 对象的方法,是连接到对象的系绳,我们可以按照这条线访问内存中其他地方的对象。
第二行
关于你的第二行:
A obj2=obj1;
首先声明一个名为 obj2
的新变量来保存对类型 A
的对象的引用。然后您从 obj1
复制了引用并将该副本放入 obj2
.
你还剩下:
- 单个对象。
- 对该单个对象的两个引用。
当我在 java 中将一个对象初始化为另一个对象时会发生什么?是在新对象中复制了该对象的引用,还是使用与原始对象中相同的成员值创建的新对象;
A obj1=new A("apple");
A obj2=obj1;
这个场景的正确解释是什么?
这只是复制的引用,而不是其他内存中的实际新对象 space。
通常对于 deep-copy
,您可以在 class 中声明自己的 clone
方法,该方法使用传递的对象的属性并使用 new
关键字创建另一个对象,并且returns它。这样,当您使用 clone
方法时,您将拥有一个新对象。更具体地说,您可以声明 class 来实现 Cloneable
接口,然后为父 Object
class 中已经存在的方法 clone()
提供覆盖实现。
对于 shallow-copy
你应该在你的 class 中再次创建一个 clone
方法,在这个方法中你可以只使用 return super.clone()
这样默认的 clone()
Object
class 提供的方法将用于创建对象的 shallow-copy
,这意味着只有原始字段将被实际复制,对于任何非原始字段,引用将被复制。
对于这个 class 中的字段只有一些 String
的简单示例,您可以使用 Object
[=38] 已经提供的 clone
的浅表副本=] 这似乎足够了。
但是,如果您在此 class 中有更多非原始字段,那么您将不得不 override
您的 clone
方法并提供一些实现,以便可以返回深层副本.
when I initialize one object to another in java
我不知道你所说的“对另一个人”是什么意思。但是你只初始化了一个对象。
第一行
关于你的第一行:
A obj1=new A("apple");
A obj1
声明了一个引用变量,给它起一个名字 obj1
,并指定这个变量将保存对任何类型 A
对象的引用。这个参考变量最初是 null.
调用new A("apple")
在内存中的某个地方构造一个对象。此代码的结果 return 值是对新对象的引用。
=
将该引用指定为名为 obj1
的变量的内容。
您可以将引用变量视为包含内存中该对象的已分配内存块的开头所在的地址。在 Java 中,我们永远看不到引用变量的文字内容。但是我们知道我们可以通过那个引用变量到达对象。
在我们日常的编程工作中Java,我们可能一般会认为obj1
是是对象。但实际上 obj1
是一种 找到 对象的方法,是连接到对象的系绳,我们可以按照这条线访问内存中其他地方的对象。
第二行
关于你的第二行:
A obj2=obj1;
首先声明一个名为 obj2
的新变量来保存对类型 A
的对象的引用。然后您从 obj1
复制了引用并将该副本放入 obj2
.
你还剩下:
- 单个对象。
- 对该单个对象的两个引用。