Java obj1=obj.clone()和obj1=obj之间的差异
谁能解释一下Java obj1=obj.clone()和obj1=obj之间的差异,java,clone,Java,Clone,谁能解释一下obj1=obj.clone()和obj1=obj之间的区别吗?显然,一个创建了克隆,另一个没有 obj = new Object(); obj1 = obj; // obj1 and obj reference *the same object* 对 obj1 = obj.clone(); // obj1 references *a copy of* obj obj.clone()创建一个新对象-基本上是obj的副本。因此,在调用obj
obj1=obj.clone()
和obj1=obj
之间的区别吗?显然,一个创建了克隆,另一个没有
obj = new Object();
obj1 = obj; // obj1 and obj reference *the same object*
对
obj1 = obj.clone(); // obj1 references *a copy of* obj
obj.clone()
创建一个新对象-基本上是obj的副本。因此,在调用obj1=obj.clone()
之后,您有两个不同的对象。调用obj1=obj
时,obj
和obj1
都将引用相同的对象
i、 例如,当调用obj1=obj
时,您会遇到如下情况:
obj --> *obj* <-- obj1
obj --> *obj*
obj1 --> *copy of obj*
当且仅当此对象实现了
Cloneable
时,第一个将创建对象的新副本。否则,.clone()
将抛出
第二个简单地复制引用
请参见克隆(obj1=obj.clone()
)意味着您创建了一个与旧对象相等的新对象。简单赋值(obj1=obj
)意味着对同一对象有另一个引用
最好的说明方法是思考修改原始对象时会发生什么
考虑以下示例:
Cat orig = new Cat();
Cat assigned = orig;
Cat cloned = orig.clone();
orig.setGrumpy(true);
最后一行将
orig
cat变为脾气暴躁。现在,assigned
也很暴躁,因为它只是对同一对象的另一个引用<代码>克隆,另一方面,保持不变,因为一旦克隆对象,就会丢失从另一个对象创建的所有内存。obj1=obj.clone是obj的克隆。复制对象。ob1=obj只是obj作为obj1的参考。如果您在obj中更改了某些内容,它将反映obj1。上一个不是,甚至不是clone()
是一个令人难以置信的漏洞,应该很少使用。