一、java中的构建模型直接支持原始模型。所有的javaBean都继承Object类,Object类有一个clone方法,用于克隆对象,而克隆对象又分为浅复制和深复制。
二、大致结构
1、原始接口类
2、具体原始类
三、代码
1、原始接口类
package com.prototype; public interface Prototype extends Cloneable { Prototype deepClone(); Prototype shallowClone(); }
2、具体原始类
package com.prototype; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class Person implements Prototype, Serializable { /** * */ private static final long serialVersionUID = -5730267042366141834L; private String name; private int age; private Dog dog; public Person(String name, int age, Dog dog) { this.name = name; this.age = age; this.dog = dog; } public Dog getDog() { return dog; } public void setDog(Dog dog) { this.dog = dog; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } /** * 深复制,会将dog引用的对象也复制一份 */ @Override public Prototype deepClone() { //创建数组输出流,将对象存到内存中 ByteArrayOutputStream byteArrayOutputStream = null; ObjectOutputStream objectOutputStream = null; ByteArrayInputStream byteArrayInputStream = null; ObjectInputStream objectInputStream = null; Person person = null; try { byteArrayOutputStream = new ByteArrayOutputStream(); objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); //将对象存入内存,并复制一份留在堆中 objectOutputStream.writeObject(this); byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); objectInputStream = new ObjectInputStream(byteArrayInputStream); //读取内存,将对象取出 person = (Person) objectInputStream.readObject(); } catch (Exception e) { e.printStackTrace(); } finally { try { if(byteArrayOutputStream != null) { byteArrayOutputStream.close(); } if(objectOutputStream != null) { objectOutputStream.close(); } if(byteArrayInputStream != null) { byteArrayInputStream.close(); } if(objectInputStream != null) { objectInputStream.close(); } } catch (Exception e) { e.printStackTrace(); } } return person; } /** * 浅复制,复制dog对象的引用 */ @Override public Prototype shallowClone() { Prototype obj = null; try { obj = (Person)super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return obj; } }
3、Person的附属对象
package com.prototype; import java.io.Serializable; public class Dog implements Serializable { /** * */ private static final long serialVersionUID = 5518998591955476396L; private String name; private String color; public Dog(String name, String color) { this.name = name; this.color = color; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } @Override public String toString() { return "Dog [name=" + name + ", color=" + color + "]"; } }
4、测试类
package com.prototype; public class Test { public static void main(String[] args) { Person person1 = new Person("youth", 22, new Dog("阿黄", "黄色")); Person person2 = (Person) person1.shallowClone(); //浅复制的dog对象仍然是原来的对象 System.out.println(person1.getDog() == person2.getDog()); Person person3 = (Person) person1.deepClone(); //深复制的dog对象是不是同一个对象,两者为克隆关系 System.out.println(person1.getDog() == person3.getDog()); System.out.println("本尊:" + person1.getDog()); System.out.println("克隆:" + person3.getDog()); } }
5、结果
true
false
本尊:Dog [name=阿黄, color=黄色]
克隆:Dog [name=阿黄, color=黄色]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?