在Java中要实现克隆很简单,只要在需要克隆的类实现Cloneable,并调用其clone方法即可。最简单的克隆如下
package cn.quinn.test;
public class TEST implements Cloneable {
public String id;
public T2 t2;
public static void main(String[] args) {
TEST t = new TEST();
t.id = "1";
try {
TEST t2 = (TEST) t.clone();
System.out.println(t);
System.out.println(t2);
System.out.println(t2.id);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
打印结果为
cn.quinn.test.TEST@1fb8ee3
cn.quinn.test.TEST@61de33
1
可以看到t和t2已经不是一个对象,但是id值相同。
Java中的克隆分为浅克隆和深克隆
默认的克隆方法提供的为浅克隆,浅克隆表现方式如下
package cn.quinn.test;
public class TEST implements Cloneable {
public String id;
public T2 t2;
public static void main(String[] args) {
TEST t = new TEST();
T2 t21 = new T2(); //new一个属性对象
t.t2 = t21;//把T2的对象传给t
System.out.println(t21); //打印一下
try {
TEST t2 = (TEST) t.clone();
System.out.println(t2.t2); //克隆结果
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
打印结果
cn.quinn.test.T2@61de33
cn.quinn.test.T2@61de33
两个对象完全相同,这就是浅copy,当更改克隆后的对象属性的值后会影响到克隆前的对象,因为它们是同一块内存地址。
在Java中如何实现深度克隆呢?
方法很多 可以重写属性类的clone方法 ,这样做不好的地方就是一旦对象属性过多就会写很多
最好的方法就是序列化和反序列化,不过所有的类和属性类都必须实现Serializable接口
如下
package cn.quinn.test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class TEST implements Cloneable, Serializable {
public String id;
public T2 t2;
@Override
protected Object clone() throws CloneNotSupportedException {
ByteArrayOutputStream byteout = null;
ObjectOutputStream out = null;
ByteArrayInputStream bytein = null;
ObjectInputStream in = null;
try {
byteout = new ByteArrayOutputStream();
out = new ObjectOutputStream(byteout);
out.writeObject(this);
bytein = new ByteArrayInputStream(byteout.toByteArray());
in = new ObjectInputStream(bytein);
return in.readObject();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (in != null) {
in.close();
in = null;
}
} catch (Exception e) {
}
try {
if (bytein != null) {
bytein.close();
bytein = null;
}
} catch (Exception e) {
}
try {
if (out != null) {
out.close();
out = null;
}
} catch (Exception e) {
}
try {
if (byteout != null) {
byteout.close();
byteout = null;
}
} catch (Exception e) {
}
}
return null;
}
public static void main(String[] args) {
TEST t = new TEST();
T2 t21 = new T2(); //new一个属性对象
t.t2 = t21;//把T2的对象传给t
System.out.println(t21); //打印一下
try {
TEST t2 = (TEST) t.clone();
System.out.println(t2.t2); //克隆结果
} catch (CloneNotSupportedException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
package cn.quinn.test;
import java.io.Serializable;
public class T2 implements Serializable{
private String t2;
public String getT2() {
return t2;
}
public void setT2(String t2) {
this.t2 = t2;
}
}
分享到:
相关推荐
在Java编程语言中,克隆(Clone)机制是一种创建对象副本的方法,它允许开发者创建一个已有对象的新实例,这个新实例与原对象具有相同的属性值,但却是两个独立的对象,彼此的操作不会互相影响。克隆机制在某些情况...
浅克隆是通过实现`Cloneable`接口并覆盖`Object`类中的`clone()`方法来实现的。当一个对象被浅克隆时,新创建的对象会拥有原始对象的所有字段的副本,但是这些字段如果是引用类型(比如对象),则新旧对象共享同一...
### Java深度克隆详解 #### 一、引言 在Java开发过程中,对象拷贝是一项常见操作。根据拷贝程度的不同,对象拷贝通常分为浅拷贝和深度拷贝两种类型。浅拷贝只复制对象的基本属性,而深度拷贝不仅复制基本属性,还...
克隆机制的保护机制是通过在 Object 中将 Clone 方法申明为 protected 实现的,这样可以保证只有相应类内部才能“克隆”对象。例如,在 Employee 类中,可以申明 Clone 方法为 protected,以保证只有 Employee 类...
这个方法是Object类的一个成员,因此所有的Java类都默认拥有`clone`方法。不过,需要注意的是,`clone`方法并不执行深拷贝,也就是说,如果对象中包含引用类型的属性,这些引用指向的内存区域是共享的,不是完全独立...
`clone`方法存在于Java的`java.lang.Object`基类中,所有Java类都默认继承自`Object`类,因此所有类都具备`clone`能力。 首先,要使用`clone`方法,我们需要确保类实现了`Cloneable`接口。`Cloneable`接口并没有...
实现深克隆通常需要自定义实现,因为Java的`clone()`方法不支持自动深度克隆。一种常见的实现方法是序列化和反序列化对象。首先,将对象序列化为字节数组,然后从字节数组反序列化为新的对象。这种方法可以保证所有...
在本文中,我们将深入探讨Java中的浅克隆(shallow clone)和深克隆(deep clone),并结合测试代码进行分析。 首先,让我们理解`Cloneable`接口。在Java中,如果一个类想要支持`clone()`方法,它必须实现`...
在Java编程语言中,`clone()`方法是一个非常重要的概念,特别是在对象复制和克隆方面。这个小例子将帮助初学者理解如何在Java中使用`clone()`来创建对象的副本。让我们深入探讨`clone()`方法以及它在实际编程中的...
在Java编程语言中,克隆是创建一个对象副本的过程,这个副本与原对象有相同的属性值,但作为不同的对象存在。克隆分为两种主要类型:浅克隆(Shallow Clone)和深克隆(Deep Clone)。这篇博客文章将探讨这两种克隆...
Java中的`clone()`方法是Object类的一个成员方法,它提供了创建一个对象副本的功能。这篇文章将深入探讨`clone()`方法的工作原理、使用场景以及浅拷贝(shallow clone)与深拷贝(deep clone)的区别。 首先,让...
Java提供了两种主要的克隆方式:浅克隆(Shallow Clone)和深克隆(Deep Clone)。下面我们将深入探讨这两种克隆方法。 ### 浅克隆 浅克隆是指创建一个新的对象,其成员变量的值与原对象相同,但引用类型成员变量...
浅克隆是Java克隆机制的默认行为。当一个对象被克隆时,如果它的成员变量是基本类型(如int、double等),则这些成员变量会被逐个复制到新创建的对象中。然而,如果成员变量是引用类型(对象),那么新对象和原对象...
在Java中,克隆操作是通过实现`Cloneable`接口和重写`Object`类的`clone()`方法来完成的。但需要注意的是,`clone()`方法默认执行的是浅克隆,因此如果对象中包含对其他对象的引用,这些引用不会被复制。为了实现...
Java中的对象复制与克隆是程序开发中常见的需求,主要用于创建一个对象的副本,而不会影响原始对象的状态。这里主要讨论两种类型的对象拷贝:浅拷贝和深拷贝。 浅拷贝,也称为表面拷贝,是创建一个新的对象,然后将...
2. **浅克隆**:通过实现`Cloneable`接口并重写`Object`类的`clone()`方法,可以实现浅克隆。浅克隆只会复制对象自身的属性,如果对象中包含其他对象的引用,那么这些引用会被共享。 3. **深克隆**:深克隆需要递归...