当前位置: 首页 > wzjs >正文

杭州网站开发工资重庆公司章程如何查询下载

杭州网站开发工资,重庆公司章程如何查询下载,设计师应该知道的网站,上海网站建设公司兴田德润可以不浅拷贝 浅拷贝会创建一个新的对象,复制该对象的基本类型引用,但不复制该对象内的其他对象引用。一个对象要支持浅拷贝,需要实现Cloneable接口,不然在调用clone()方法时会抛出异常 protected Object clone() throws CloneNotSuppo…

浅拷贝

浅拷贝会创建一个新的对象,复制该对象的基本类型引用,但不复制该对象内的其他对象引用。一个对象要支持浅拷贝,需要实现Cloneable接口,不然在调用clone()方法时会抛出异常

    protected Object clone() throws CloneNotSupportedException {if (!(this instanceof Cloneable)) {throw new CloneNotSupportedException("Class " + getClass().getName() +" doesn't implement Cloneable");}return internalClone();}

看个简单的demo

public class ShallowCopy implements Cloneable {int i = 10;String str = "ShallowCopy";Shallow shallow = new Shallow();public static class Shallow {String shallow = "shallow";}public static void testShallowCopy() {ShallowCopy shallowCopy = new ShallowCopy();try {ShallowCopy shallowCopyClone = (ShallowCopy) shallowCopy.clone();LogUtil.info("ShallowCopy", "(shallowCopy == shallowCopyClone) = " + (shallowCopy == shallowCopyClone));LogUtil.info("ShallowCopy", "(shallowCopy.equals(shallowCopyClone)) = " + (shallowCopy.equals(shallowCopyClone)));LogUtil.info("ShallowCopy", "(shallowCopy.shallow == shallowCopyClone.shallow) = " + (shallowCopy.shallow == shallowCopyClone.shallow));LogUtil.info("ShallowCopy", "(shallowCopy.shallow.equals(shallowCopyClone.shallow)) = " + (shallowCopy.shallow.equals(shallowCopyClone.shallow)));} catch (CloneNotSupportedException e) {throw new RuntimeException(e);}}
}

打印结果如下

2025-03-13 16:53:25.564   (shallowCopy == shallowCopyClone) = false
2025-03-13 16:53:25.564   (shallowCopy.equals(shallowCopyClone)) = false
2025-03-13 16:53:25.564   (shallowCopy.shallow == shallowCopyClone.shallow) = true
2025-03-13 16:53:25.564   (shallowCopy.shallow.equals(shallowCopyClone.shallow)) = true

我们发现shallowCopyshallowCopyClone指向不同的对象,但是里面的shallow却是同一个。如果要实现两个shallowCopyshallowCopyClone两个完全不同的对象,也即是要实现深拷贝,有两个办法,下文介绍两种方法

深拷贝

  1. 内部的对象引用所属类也继承clone接口,重写clone()方法,例如
public class ShallowCopy implements Cloneable {int i = 10;String str = "ShallowCopy";Shallow shallow = new Shallow();@NonNull@Overrideprotected Object clone() throws CloneNotSupportedException {ShallowCopy cloned = (ShallowCopy)super.clone();cloned.shallow = (Shallow)shallow.clone();return cloned;}public static class Shallow implements Cloneable {String shallow = "shallow";@NonNull@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}}public static void testShallowCopy() {ShallowCopy shallowCopy = new ShallowCopy();try {ShallowCopy shallowCopyClone = (ShallowCopy) shallowCopy.clone();LogUtil.info("ShallowCopy", "(shallowCopy == shallowCopyClone) = " + (shallowCopy == shallowCopyClone)); // falseLogUtil.info("ShallowCopy", "(shallowCopy.equals(shallowCopyClone)) = " + (shallowCopy.equals(shallowCopyClone))); // falseLogUtil.info("ShallowCopy", "(shallowCopy.shallow == shallowCopyClone.shallow) = " + (shallowCopy.shallow == shallowCopyClone.shallow)); // falseLogUtil.info("ShallowCopy", "(shallowCopy.shallow.equals(shallowCopyClone.shallow)) = " + (shallowCopy.shallow.equals(shallowCopyClone.shallow))); // false} catch (CloneNotSupportedException e) {throw new RuntimeException(e);}}
}

返回结果

2025-03-13 17:14:09.906   (shallowCopy == shallowCopyClone) = false
2025-03-13 17:14:09.906   (shallowCopy.equals(shallowCopyClone)) = false
2025-03-13 17:14:09.906   (shallowCopy.shallow == shallowCopyClone.shallow) = false
2025-03-13 17:14:09.906   (shallowCopy.shallow.equals(shallowCopyClone.shallow)) = false

但这个方法有个弊端,就是如果引用对象的链路比较深,例如 A 引用 B,B 引用 C,C 引用 D,甚至更深,就需要重写很多clone()方法,不易于维护.

值得注意的是Shallow类里面的shallow变量,它是一个String类型的对象引用,但是却可以不用实现clone接口实现深拷贝。原因是String是不可变的,修改String类型都会返回一个新对象,参考文档String 基础知识

  1. 使用Serializable序列化实现深拷贝

需要注意的是引用对象的类型也要实现Serializable接口,不然后报错

public class ShallowCopy implements Cloneable, Serializable {public static class Shallow implements Cloneable, Serializable {}
}

如果Shallow没有实现Serializable接口,则会出现java.io.NotSerializableException。接着使用IO实现序列化和反序列化

    public ShallowCopy deepClone() {ShallowCopy deepClone = null;try {ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos);oos.writeObject(this);ByteArrayInputStream bio = new ByteArrayInputStream(bos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bio);deepClone = (ShallowCopy) ois.readObject();} catch (IOException | ClassNotFoundException e) {throw new RuntimeException(e);}return deepClone;}

结果打印

    public static void testDeepCopy() {ShallowCopy shallowCopy = new ShallowCopy();ShallowCopy shallowCopyDeepClone = shallowCopy.deepClone();LogUtil.info("ShallowCopy", "(shallowCopy == shallowCopyDeepClone) = " + (shallowCopy == shallowCopyDeepClone)); // falseLogUtil.info("ShallowCopy", "(shallowCopy.equals(shallowCopyDeepClone)) = " + (shallowCopy.equals(shallowCopyDeepClone))); // falseLogUtil.info("ShallowCopy", "(shallowCopy.shallow == shallowCopyDeepClone.shallow) = " + (shallowCopy.shallow == shallowCopyDeepClone.shallow)); // falseLogUtil.info("ShallowCopy", "(shallowCopy.shallow.equals(shallowCopyDeepClone.shallow)) = " + (shallowCopy.shallow.equals(shallowCopyDeepClone.shallow))); // false}
http://www.dtcms.com/wzjs/814168.html

相关文章:

  • 网站访问量统计工具静态网站建设步骤
  • 天津网站运营企业网站建设作用
  • 欣赏艺术类的网站Wordpress搜索html页面
  • 手机营销型网站制作潍坊市住房和城乡建设局官网
  • 网站收录了怎么做排名嘉兴企业网站排名
  • 专业提供网站建设服务18岁以上准备好纸巾免费网站
  • 大型网站建设建站模板网站建设培训 通州
  • 百度网站搜索排名网站建设管理分工
  • 西安建设市场信息平台在seo优化中
  • 太原网站制作公司飞向未来煎蛋wordpress
  • 网站设计制作全网优惠抖音广告投放平台
  • 哪个网站可以做链接长沙微网站建设
  • 犀浦网站建设域名注册服务机构注销域名的情形
  • 乌镇网站开发文档璧山最新消息
  • 网站优化 秦皇岛邢台微信网站
  • 做资讯的网站嘉定网站建设哪里便宜
  • 如何在网站申请做co建设一个聊天类的网站
  • 怎么制作个人网站关键词seo深圳
  • 做网站培训班泉州网页建站模板
  • 网站要实名认证吗手机制图设计免费软件下载
  • wordpress 企业站模版营销网站建设内容
  • nas服务器 做网站微信公众平台注册不了
  • aspx网站配置服务器深圳最大的手机市场在什么地方
  • 南京网站建设工作室建立网站需要注册公司吗
  • 网站建站那个好网络培训的功能主要有
  • dnf怎么做钓鱼网站网站制作教程一般地建网络
  • 网站应用网站开发百度网站关键字
  • 廊坊企业建站在地税网站怎么做税种认定
  • 中国建设部网站监理延续cn域名注册网站
  • 网站建设公司服怎么做免费的产品图片网站