Java支持我们对一个对象进行克隆,通常用在装饰模式和原型模式中,克隆分为两种:
浅克隆:通常只是对克隆的实例进行复制,如果被克隆的实例的变量是原始数据类型和不可改变类,则克隆和被克隆实例的变量是不共用的;如果被克隆的实例的变量是可变引用数据类型,则克隆和被克隆实例的变量是引用同一个对象的,改变其中一个实例的变量的属性值会影响到另外一个实例的变量的属性值。
深克隆:和浅克隆的差别在于,可变引用数据类型也是不共用的。
浅克隆,实现Cloneable,并重写clone方法
public class Demo {
public static void main(String[] args) {
A a=new A();
a.i=10;
B b=new B();
b.j=20;
b.s="s";
b.k=new Integer(30);
b.a=a;
try {
B bClone=(B)b.clone();
bClone.j=40;
bClone.s="ss";
bClone.k=50;
bClone.a.i = 60;
System.out.println(b.j);// 结果:20 。原因:原始数据类型,不会互相影响。
System.out.println(b.s);// 结果:s。原因:不可变引用数据类型,不会互相影响。
System.out.println(b.k);// 结果:30。原因:不可变引用数据类型,不会互相影响。
System.out.println(b.a.i);// 结果:60。原因:可变引用数据类型是共用的。
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
class A {
int i;
}
class B implements Cloneable{
int j;
String s;
Integer k;
A a;
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
深克隆,利用对象流
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class Demo {
public static void main(String[] args) {
A a = new A();
a.i = 10;
B b = new B();
b.a = a;
try {
ByteArrayOutputStream baos=new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(baos);
oos.writeObject(b);
ByteArrayInputStream bais=new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois=new ObjectInputStream(bais);
B b1=(B)ois.readObject();
b1.a.i=20;
System.out.println(b.a.i);// 结果:10。原因:可变引用数据类型不共用的。
oos.close();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
@SuppressWarnings("serial")
class A implements Serializable{
int i;
}
@SuppressWarnings("serial")
class B implements Serializable {
A a;
}
分享到:
相关推荐
`Cloneable`接口是Java提供的一种标记接口,表示一个类支持克隆。当你试图对一个没有实现`Cloneable`接口的对象调用`clone()`方法时,会抛出`CloneNotSupportedException`。实现这个接口表明类愿意并且能够被克隆。 ...
例如,假设我们有一个 Employee 对象,通过浅克隆可以生成一个新的 Employee 对象,但是这两个对象共享同一个 Date 对象的 reference,这样克隆类就和原始类共享了一部分信息,这是不利的。 深克隆(Deep Clone)则...
### Java深度克隆知识点详解 #### 一、深度克隆概念 在Java中,深度克隆是一种用于创建对象副本的方法,它可以确保复制出的新对象与原对象之间没有任何引用关系,也就是说,新对象中的所有成员变量(包括引用类型)...
浅克隆是通过实现`Cloneable`接口并覆盖`Object`类中的`clone()`方法来实现的。当一个对象被浅克隆时,新创建的对象会拥有原始对象的所有字段的副本,但是这些字段如果是引用类型(比如对象),则新旧对象共享同一...
java克隆技术的入门及深入研究,帮助读者更好的理解java克隆技术,掌握关键知识点。
在Java中,克隆操作是通过实现`Cloneable`接口和重写`Object`类的`clone()`方法来完成的。但需要注意的是,`clone()`方法默认执行的是浅克隆,因此如果对象中包含对其他对象的引用,这些引用不会被复制。为了实现...
可以更好的去理解java克隆的运用,尤其在多线程的运用过程中,多个对象进行操作过程中,可以先进行对 对象进行 备份,首先就克隆一份,当多线程对对象操作过程中,与异常情况,可以对对象进行恢复,克隆还其他的用途,学会...
测试类`Test.java`可以用来验证浅克隆和深克隆的效果,比如改变克隆对象的属性并检查原始对象是否受影响。 总结来说,Java中的克隆机制对于复制对象和维护对象状态的独立性至关重要。浅克隆适用于不涉及复杂引用...
在Java编程语言中,克隆和序列化是两个重要的概念,它们在数据处理和对象管理中扮演着关键角色。下面将分别对这两个概念进行详细解释,并结合实例和源代码进行阐述。 **一、克隆** 1. **克隆定义**:克隆是指创建...
在Java编程语言中,克隆(Clone)机制是一种创建对象副本的方法,它允许开发者创建一个已有对象的新实例,这个新实例与原对象具有相同的属性值,但却是两个独立的对象,彼此的操作不会互相影响。克隆机制在某些情况...
Java中的对象复制与克隆是程序开发中常见的需求,主要用于创建一个对象的副本,而不会影响原始对象的状态。这里主要讨论两种类型的对象拷贝:浅拷贝和深拷贝。 浅拷贝,也称为表面拷贝,是创建一个新的对象,然后将...
在Java编程语言中,对象克隆是一种创建一个与原对象具有相同数据的新对象的过程。对象克隆主要用于复制或备份对象,以便在不干扰原始对象的情况下对其进行修改或操作。本篇文章将详细探讨Java中的对象克隆及其实现...
在Java中,对象克隆可以通过实现`Cloneable`接口并覆盖`Object`类中的`clone()`方法来完成。`Cloneable`接口本身不包含任何方法,只是一个标记接口,表明该类的对象可以被克隆。`Object`类的`clone()`方法会创建一个...
java的两种深度克隆方法,1cloneTest是用Cloneable接口的clone方法实现(对象必须要实现cloneable接口).2cloneSerialize.java是用对象流写对象到byte数组中,然后从byte数组中取得对象.(对象必须要实现serializble接口)
在 Java 中,Object 类的 clone() 方法提供了克隆的功能,但是这个方法的缺省实现会抛出 CloneNotSupportedException 异常。一个类要实现克隆必须重写 Object 类的 clone() 方法,并且要实现 Cloneable 接口。 例如...
java代码-使用java解决克隆问题的源代码 ——学习参考资料:仅用于个人学习使用!
在Java编程中,对象复制和克隆是两个重要的概念,特别是在处理复杂数据结构时。对象复制通常分为浅拷贝和深拷贝。标题中的“java对象复制克隆”主要涉及的是深拷贝,这是一种创建一个新对象的方式,新对象不仅复制...