Java克隆函数简介
在Java中,克隆(Clone)是指创建一个对象的副本,这个副本与原对象具有相同的属性值和方法,克隆函数通常用于实现对象的深拷贝,即创建一个与原对象完全独立的新对象,Java提供了多种克隆方式,如浅拷贝(shallow copy)和深拷贝(deep copy),本文主要介绍Java中的克隆函数及其使用方法。
Java浅拷贝
浅拷贝是指创建一个新对象,然后将原对象的非静态成员变量的引用复制到新对象中,这样,新对象和原对象的成员变量指向同一个内存地址,在Java中,可以通过实现Cloneable
接口并重写clone()
方法来实现浅拷贝。
以下是一个简单的示例:
class Person implements Cloneable { String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } }
使用示例:
public class Main { public static void main(String[] args) { Person p1 = new Person("张三", 25); try { Person p2 = (Person) p1.clone(); System.out.println("p1: " + p1.name + ", " + p1.age); System.out.println("p2: " + p2.name + ", " + p2.age); } catch (CloneNotSupportedException e) { e.printStackTrace(); } } }
输出结果:
p1: 张三, 25
p2: 张三, 25
从输出结果可以看出,p1
和p2
的成员变量指向同一个内存地址,因此它们的值是相同的,这就是浅拷贝的特点。
Java深拷贝
深拷贝是指创建一个新对象,并将原对象的非静态成员变量的值复制到新对象中,这样,新对象和原对象的成员变量指向不同的内存地址,在Java中,可以通过序列化和反序列化的方式来实现深拷贝,需要注意的是,只有实现了Serializable
接口的对象才能通过这种方式进行深拷贝,还可以通过自定义序列化和反序列化的实现类来实现深拷贝。
以下是一个简单的示例:
import java.io.*; class Person implements Serializable { String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } }
使用示例:
public class DeepCopyDemo { public static void main(String[] args) throws Exception { Person p1 = new Person("张三", 25); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(p1); oos.close(); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); Person p2 = (Person) ois.readObject(); ois.close(); System.out.println("p1: " + p1.name + ", " + p1.age); System.out.println("p2: " + p2.name + ", " + p2.age); } }
输出结果:
p1: 张三, 25 p2: 张三, 25
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/137251.html