package com.zwx.design.pattern.prototype.impl;
import com.zwx.design.pattern.prototype.IPrototype;
import java.util.List;
public class PrototypeImplA implements IPrototype{
private String name;
private int age;
private List phoneList;
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;
}
public List getPhoneList() {
return phoneList;
}
public void setPhoneList(List phoneList) {
this.phoneList = phoneList;
}
@Override
public IPrototype clone() {
PrototypeImplA prototypeImplA = new PrototypeImplA();
prototypeImplA.setAge(this.age);
prototypeImplA.setName(this.name);
prototypeImplA.setPhoneList(this.phoneList);
return prototypeImplA;
}
}
PrototypeImplA实现了接口IPrototype,并且实现了clone方法,返回了一个新的对象
package com.zwx.design.pattern.prototype;
import com.zwx.design.pattern.prototype.impl.PrototypeImplA;
import java.util.ArrayList;
import java.util.List;
public class ProtoTypeTest {
public static void main(String[] args) throws Exception {
PrototypeImplA prototypeImplA = new PrototypeImplA();
prototypeImplA.setAge(18);
prototypeImplA.setName(“张三”);
List phoneList = new ArrayList<>();
phoneList.add(“88888888”);
phoneList.add(“77777777”);
prototypeImplA.setPhoneList(phoneList);
PrototypeImplA cloneProtoType = (PrototypeImplA) prototypeImplA.clone();
System.out.println(prototypeImplA.getPhoneList() == cloneProtoType.getPhoneList());//true
}
}
最后一个会输出true,这是因为这种克隆方式是浅克隆,对象中如果有引用对象那么被克隆后的对象依然会指向原对象,如果需要复制两个独立的对象,则需要使用深克隆,后面示例2中我们会对比一下两种克隆方式
====================================================================
package com.zwx.design.pattern.prototype.impl;
import java.io.*;
import java.util.List;
public class PrototypeB implements Cloneable {
private String name;
private int age;
private List phoneList;
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;
}
public List getPhoneList() {
return phoneList;
}
public void setPhoneList(List phoneList) {
this.phoneList = phoneList;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
Object类默认有clone()方法,protected级别,且是浅克隆,如果我们需要使用默认的clone()方法,则必须实现一个Cloneable接口(Cloneable是一个标记接口,类似的还有Serializable等接口),否则会抛出异常CloneNotSupportedException
package com.zwx.design.pattern.prototype;
import com.zwx.design.pattern.prototype.impl.PrototypeB;
import java.util.ArrayList;
import java.util.List;
public class ProtoTypeTest2 {
public static void main(String[] args) throws CloneNotSupportedException {
PrototypeB prototypeImplB = new PrototypeB();
prototypeImplB.setAge(18);
prototypeImplB.setName(“张三”);
List phoneList = new ArrayList<>();
phoneList.add(“88888888”);
phoneList.add(“77777777”);
prototypeImplB.setPhoneList(phoneList);
PrototypeB cloneProtoTypeB = (PrototypeB)prototypeImplB.clone();
System.out.println(prototypeImplB.getPhoneList() == cloneProtoTypeB.getPhoneList());//true
}
}
这时候输出的结果还是true,因为上面我们用的是Object自带的clone()方法,默认是浅克隆,那么如何实现深克隆呢?接下来我们对PrototypeB类进行改写。
package com.zwx.design.pattern.prototype.impl;
import java.io.*;
import java.util.List;
public class PrototypeB implements Cloneable, Serializable {
private String name;
private int age;
private List phoneList;
public String getName() {
return name;
}
public void setName(String name) throws CloneNotSupportedException{
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List getPhoneList() {
return phoneList;
}
public void setPhoneList(List phoneList) {
this.phoneList = phoneList;
}
public Object clone() throws CloneNotSupportedException {
// return super.clone();
return this.deepClone();
}
public PrototypeB deepClone(){
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
PrototypeB clone = (PrototypeB)ois.readObject();
return clone;
}catch (Exception e){
return null;
}
}
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后
由于篇幅原因,就不多做展示了
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
95254671a72faed303032d36.jpg" alt=“img” style=“zoom: 33%;” />
最后
[外链图片转存中…(img-wzaR0oHr-1713425992952)]
[外链图片转存中…(img-w1FsjiNW-1713425992952)]
[外链图片转存中…(img-k13PoJXe-1713425992953)]
[外链图片转存中…(img-W5Wf5GYo-1713425992953)]
[外链图片转存中…(img-rOg7uBhp-1713425992953)]
[外链图片转存中…(img-hoGDKqRy-1713425992953)]
由于篇幅原因,就不多做展示了
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!