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

怎么做自己的网站人防工程做资料的网站

怎么做自己的网站,人防工程做资料的网站,垂直门户网站建设,机器人编程培训机构在软件开发中,克隆对象是一个常见需求。克隆的方式主要有两种:深克隆(Deep Clone)和浅克隆(Shallow Clone)。了解它们的区别及其实现方法,对于编写高效、安全的代码非常重要。 深克隆与浅克隆的…

在软件开发中,克隆对象是一个常见需求。克隆的方式主要有两种:深克隆(Deep Clone)和浅克隆(Shallow Clone)。了解它们的区别及其实现方法,对于编写高效、安全的代码非常重要。

深克隆与浅克隆的区别

浅克隆(Shallow Clone)
浅克隆会复制原型对象的基本数据类型的字段(如int, float等),而对于引用类型的字段(如对象、数组等),只会复制其引用地址。也就是说,原型对象和克隆对象会共享引用类型的字段。

深克隆(Deep Clone)
深克隆不仅复制原型对象的基本数据类型字段,还会递归复制引用类型的字段。这样,原型对象和克隆对象在内存中是完全独立的,不会共享任何引用类型的字段。

如何实现深克隆?

深克隆的实现方式有多种,下面介绍三种常见的方法:

  1. 所有对象都实现克隆方法
  2. 通过构造方法实现深克隆
  3. 使用 JDK 自带的字节流实现深克隆
所有对象都实现克隆方法

这种方式要求所有引用类型的对象都实现Cloneable接口,并重写clone方法。例如:

public class CloneExample {public static void main(String[] args) throws CloneNotSupportedException {// 创建被赋值对象Address address = new Address(001, "北京");People p1 = new People(1, "Java", address);// 克隆 p1 对象People p2 = p1.clone();// 修改原型对象p1.getAddress().setCity("上海");// 输出 p1 和 p2 地址信息System.out.println("p1:" + p1.getAddress().getCity() + " p2:" + p2.getAddress().getCity());}static class People implements Cloneable {private Integer id;private String name;private Address address;@Overrideprotected People clone() throws CloneNotSupportedException {People people = (People) super.clone();people.setAddress(this.address.clone()); // 引用类型克隆赋值return people;}// getter 和 setter 方法public People(Integer id, String name, Address address) {this.id = id;this.name = name;this.address = address;}}static class Address implements Cloneable {private Integer id;private String city;@Overrideprotected Address clone() throws CloneNotSupportedException {return (Address) super.clone();}// getter 和 setter 方法public Address(Integer id, String city) {this.id = id;this.city = city;}}
}
通过构造方法实现深克隆

《Effective Java》中推荐使用构造器来实现深克隆。构造器的参数为基本数据类型或字符串类型时直接赋值,如果是对象类型,则需要重新创建一个新的对象。

public class SecondExample {public static void main(String[] args) {// 创建对象Address address = new Address(001, "北京");People p1 = new People(1, "Java", address);// 调用构造函数克隆对象People p2 = new People(p1.getId(), p1.getName(), new Address(p1.getAddress().getId(), p1.getAddress().getCity()));// 修改原型对象p1.getAddress().setCity("上海");// 输出 p1 和 p2 地址信息System.out.println("p1:" + p1.getAddress().getCity() + " p2:" + p2.getAddress().getCity());}static class People {private Integer id;private String name;private Address address;// getter 和 setter 方法public People(Integer id, String name, Address address) {this.id = id;this.name = name;this.address = address;}}static class Address {private Integer id;private String city;// getter 和 setter 方法public Address(Integer id, String city) {this.id = id;this.city = city;}}
}
使用 JDK 自带的字节流实现深克隆

通过字节流实现深克隆的方式是将原型对象写入到内存中的字节流,然后再从这个字节流中读出信息,生成一个新对象。这个新对象与原型对象在内存地址上是完全独立的。

import java.io.*;public class ThirdExample {public static void main(String[] args) {// 创建对象Address address = new Address(001, "北京");People p1 = new People(1, "Java", address);// 通过字节流实现克隆People p2 = (People) StreamClone.clone(p1);// 修改原型对象p1.getAddress().setCity("上海");// 输出 p1 和 p2 地址信息System.out.println("p1:" + p1.getAddress().getCity() + " p2:" + p2.getAddress().getCity());}static class StreamClone {public static <T extends Serializable> T clone(People obj) {T cloneObj = null;try {// 写入字节流ByteArrayOutputStream bo = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bo);oos.writeObject(obj);oos.close();// 分配内存, 写入原始对象, 生成新对象ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());ObjectInputStream oi = new ObjectInputStream(bi);// 返回生成的新对象cloneObj = (T) oi.readObject();oi.close();} catch (Exception e) {e.printStackTrace();}return cloneObj;}}static class People implements Serializable {private Integer id;private String name;private Address address;// getter 和 setter 方法public People(Integer id, String name, Address address) {this.id = id;this.name = name;this.address = address;}}static class Address implements Serializable {private Integer id;private String city;// getter 和 setter 方法public Address(Integer id, String city) {this.id = id;this.city = city;}}
}

需要注意的是,由于通过字节流序列化实现的深克隆,每个对象必须实现Serializable接口,否则会抛出异常。

总结

深克隆和浅克隆在对象复制上的区别主要在于是否复制引用类型的对象。浅克隆仅复制对象本身,而深克隆会递归复制所有引用类型的对象。根据需求的不同,可以选择实现Cloneable接口、使用构造器或者通过字节流进行深克隆。了解这些实现方法,可以帮助我们在开发过程中更好地管理对象的复制和内存的使用。

http://www.yayakq.cn/news/436977/

相关文章:

  • 福州房产网站建设wordpress安装乱码
  • 贵州建设厅网站报名系统设计之家素材
  • 临时网站搭建网站收录慢
  • 网站建设怎么加音乐响应式网站和自适应
  • 企业网站建站程序在线登录qq聊天入口
  • 网站充值怎么做的惠州网站制作公司
  • 聊城企业网站建设长清做网站
  • soho做网站银川建设网站
  • 韩国教育网站模板dw旅游网站怎么做
  • 做一个网站做少钱廊坊网站制作推广
  • 快速网站开发框架手机网站模板 源码
  • 沈阳三好街附近做网站网站开发有哪些书籍
  • 门户网站域名是什么意思请问哪个网站可以做当地向导
  • 做网站需要流程wordpress丰富搜索页
  • 网站概念设计手机搭建网站
  • 鹤壁市淇滨区建设局网站专业集团门户网站建设方案
  • 响应式网站建设有哪些好处做网站入门看什么书
  • 网站开发员一月多少工资网站二级域名建站属于子站吗
  • 购物类网站建设网站设计主要做什么
  • 站群cms系统沈阳网站建设咨询
  • 网站开发主页网站右侧悬浮代码
  • 如何开发网站软件app软件温州网站优化价格
  • 建设网站是什么关系私人衣橱网站建设
  • 钟表网站开发背景文章网站关停公告怎么做
  • flash做网站通栏建设电影网站选服务器怎么选
  • 网站开发需要什么文凭广东网广东网站建设
  • 建立一个公司网站 宣传企业文化优弊端软件开发文档管理工具
  • 宁波建设工程主管部门网站要网站开发费用短信
  • 公司网站与营销网站的区别产业协会建设网站方案
  • 医疗门户网站模板黑龙江网上建设局报建网站