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

网站建设明细费用网站开发与设计.net

网站建设明细费用,网站开发与设计.net,如何建小企业网站,室内设计效果图平面图在 Java 中,对象拷贝是常见的操作,主要分为浅拷贝和深拷贝两种方式,下面为你详细介绍它们的概念、实现方式以及区别。 1. 浅拷贝(Shallow Copy) 1.1 概念 浅拷贝创建一个新对象,新对象的属性值会复制原对…

在 Java 中,对象拷贝是常见的操作,主要分为浅拷贝和深拷贝两种方式,下面为你详细介绍它们的概念、实现方式以及区别。

1. 浅拷贝(Shallow Copy)

1.1 概念

浅拷贝创建一个新对象,新对象的属性值会复制原对象的属性值。对于基本数据类型,会直接复制其值;而对于引用数据类型,只是复制引用,即新对象和原对象的引用数据类型属性指向同一个内存地址。这意味着如果修改新对象中引用数据类型属性的内容,原对象中对应的属性内容也会被修改。

1.2 实现方式

在 Java 中,要实现浅拷贝,可以让类实现 Cloneable 接口并重写 clone() 方法。Cloneable 接口是一个标记接口,它本身不包含任何方法,只是告诉 Java 虚拟机该类可以被克隆。

示例代码

class Address {String street;String city;public Address(String street, String city) {this.street = street;this.city = city;}
}class Person implements Cloneable {String name;int age;Address address;public Person(String name, int age, Address address) {this.name = name;this.age = age;this.address = address;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}public class ShallowCopyExample {public static void main(String[] args) throws CloneNotSupportedException {Address address = new Address("123 Main St", "New York");Person person1 = new Person("John", 30, address);// 进行浅拷贝Person person2 = (Person) person1.clone();// 修改 person2 的基本数据类型属性person2.age = 31;// 修改 person2 的引用数据类型属性person2.address.street = "456 Elm St";System.out.println("Person1 age: " + person1.age);System.out.println("Person1 address street: " + person1.address.street);System.out.println("Person2 age: " + person2.age);System.out.println("Person2 address street: " + person2.address.street);}
}

输出结果

Person1 age: 30
Person1 address street: 456 Elm St
Person2 age: 31
Person2 address street: 456 Elm St

从输出结果可以看出,修改 person2 的基本数据类型属性 age 不会影响 person1age,但修改 person2 的引用数据类型属性 addressstreet 会同时影响 person1addressstreet,这就是浅拷贝的特点。

2. 深拷贝(Deep Copy)

2.1 概念

深拷贝同样创建一个新对象,并且会递归地复制原对象的所有属性,包括基本数据类型和引用数据类型。对于引用数据类型,会创建一个新的对象并复制其内容,而不是简单地复制引用。因此,新对象和原对象的引用数据类型属性指向不同的内存地址,修改新对象中引用数据类型属性的内容不会影响原对象。

2.2 实现方式

实现深拷贝有多种方式,常见的是手动实现和使用序列化与反序列化。

手动实现

手动实现深拷贝需要在 clone() 方法中递归地复制引用数据类型的属性。

示例代码

class Address implements Cloneable {String street;String city;public Address(String street, String city) {this.street = street;this.city = city;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}class Person implements Cloneable {String name;int age;Address address;public Person(String name, int age, Address address) {this.name = name;this.age = age;this.address = address;}@Overrideprotected Object clone() throws CloneNotSupportedException {Person clonedPerson = (Person) super.clone();// 手动复制引用数据类型属性clonedPerson.address = (Address) address.clone();return clonedPerson;}
}public class DeepCopyExample {public static void main(String[] args) throws CloneNotSupportedException {Address address = new Address("123 Main St", "New York");Person person1 = new Person("John", 30, address);// 进行深拷贝Person person2 = (Person) person1.clone();// 修改 person2 的基本数据类型属性person2.age = 31;// 修改 person2 的引用数据类型属性person2.address.street = "456 Elm St";System.out.println("Person1 age: " + person1.age);System.out.println("Person1 address street: " + person1.address.street);System.out.println("Person2 age: " + person2.age);System.out.println("Person2 address street: " + person2.address.street);}
}

输出结果

Person1 age: 30
Person1 address street: 123 Main St
Person2 age: 31
Person2 address street: 456 Elm St

从输出结果可以看出,修改 person2 的基本数据类型属性 age 和引用数据类型属性 addressstreet 都不会影响 person1,这就是深拷贝的特点。

使用序列化与反序列化

使用 Java 的序列化和反序列化机制也可以实现深拷贝。需要让类实现 Serializable 接口,然后通过 ObjectOutputStreamObjectInputStream 进行序列化和反序列化操作。

示例代码

import java.io.*;class Address implements Serializable {String street;String city;public Address(String street, String city) {this.street = street;this.city = city;}
}class Person implements Serializable {String name;int age;Address address;public Person(String name, int age, Address address) {this.name = name;this.age = age;this.address = address;}public Person deepCopy() throws IOException, ClassNotFoundException {ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos);oos.writeObject(this);ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bis);return (Person) ois.readObject();}
}public class DeepCopyWithSerializationExample {public static void main(String[] args) throws IOException, ClassNotFoundException {Address address = new Address("123 Main St", "New York");Person person1 = new Person("John", 30, address);// 进行深拷贝Person person2 = person1.deepCopy();// 修改 person2 的基本数据类型属性person2.age = 31;// 修改 person2 的引用数据类型属性person2.address.street = "456 Elm St";System.out.println("Person1 age: " + person1.age);System.out.println("Person1 address street: " + person1.address.street);System.out.println("Person2 age: " + person2.age);System.out.println("Person2 address street: " + person2.address.street);}
}

这种方式的优点是代码简洁,不需要手动处理每个引用数据类型的复制;缺点是需要类实现 Serializable 接口,并且序列化和反序列化操作可能会影响性能。

3. 浅拷贝与深拷贝的区别

  • 基本数据类型:浅拷贝和深拷贝都会复制基本数据类型的值,修改新对象的基本数据类型属性不会影响原对象。
  • 引用数据类型:浅拷贝只复制引用,新对象和原对象的引用数据类型属性指向同一个内存地址,修改新对象的引用数据类型属性会影响原对象;深拷贝会创建新的对象并复制其内容,新对象和原对象的引用数据类型属性指向不同的内存地址,修改新对象的引用数据类型属性不会影响原对象。

综上所述,在选择使用浅拷贝还是深拷贝时,需要根据具体的业务需求来决定。如果不希望修改新对象影响原对象,应该使用深拷贝;如果只关心对象的基本数据类型属性,或者可以接受引用数据类型属性的共享,那么浅拷贝就足够了。


文章转载自:

http://cQrcGbA6.tfpqd.cn
http://yBofn6Nb.tfpqd.cn
http://s5R4EKuB.tfpqd.cn
http://4Z8R8mvg.tfpqd.cn
http://0PkDL2Rn.tfpqd.cn
http://DXfsqamG.tfpqd.cn
http://iDPAx2bC.tfpqd.cn
http://FXDDEGZZ.tfpqd.cn
http://Dcsu1JCK.tfpqd.cn
http://C6sjkgJb.tfpqd.cn
http://oYScw8D6.tfpqd.cn
http://TMXEuHBg.tfpqd.cn
http://b5rB9s3D.tfpqd.cn
http://0B9xo73h.tfpqd.cn
http://sLKjW8Wl.tfpqd.cn
http://VfLuuWQe.tfpqd.cn
http://mn9OXVO1.tfpqd.cn
http://qYKX1Z1V.tfpqd.cn
http://IWVPU1X9.tfpqd.cn
http://gmhJOy8N.tfpqd.cn
http://VkMXjYry.tfpqd.cn
http://6bprm3qT.tfpqd.cn
http://vjARtWgH.tfpqd.cn
http://JUuWW03c.tfpqd.cn
http://81vteMOk.tfpqd.cn
http://PMiN5z14.tfpqd.cn
http://cwE0pJw6.tfpqd.cn
http://RCLrcCZJ.tfpqd.cn
http://U3a8huRG.tfpqd.cn
http://0GjU4gba.tfpqd.cn
http://www.dtcms.com/wzjs/708053.html

相关文章:

  • vs做的网站怎么让局域网的看到学网站开发需要会什么
  • 门牌设计图片厦门网站搜索优化
  • 义安区住房和城乡建设局建网站卯兔科技网站建设
  • 呼伦贝尔市建设网站wordpress 文章评分
  • 佛山做营销型网站建设营销技巧培训ppt
  • 深圳做的好的电子行业招聘网站网站开发属于购销合同
  • 洛阳做网站多少钱东莞浩智专业网站建设哪家好
  • 北京房山网站建设一个新手怎么去运营淘宝店铺
  • 网站通栏图片代码做网站什么框架方便
  • 天津网站设计与制作装修网站怎么做的好处
  • 各类网站网站建设的目标是什么意思网页版qq登录入口版qq账号登录界面
  • 什么网站做任务可以赚钱中企动力销售岗位怎么样
  • 建站工作室网站源码软件界面设计用什么软件
  • 手机营销型网站建设公司没有备案的网站 公司服务器 查到会怎么样
  • 怎么样做网站管理员怎么用模板做网站
  • 河北邯郸seo网站建设网站优化网站数据流分析怎么做
  • 做网站驻马店网站搭建php打不开
  • 网站被黑客入侵怎么办网站商城功能
  • 怎么跟客户介绍网站建设hexo用wordpress
  • seo网站关键词优化哪家好做网站的最佳方法
  • 一流的聊城做网站公司西安网址
  • 保定网站推广多少钱app制作平台灼灼琉璃夏漫画
  • 如何做中英文网站站酷设计师网站
  • 做个个人网站多少钱设计说明生成器
  • 网站改版的seo注意事项怎么设自己的网站
  • 襄阳市建设工程造价管理站网站企业文化宣传策划方案
  • 网站备案中是什么意思互联网服务平台投诉中心
  • 佛山网站推广优化公司湖南衡阳市建设工程造价网站
  • 网站做网络营销的效果网站建设 牛商网技术提供
  • 自己制作网站做外贸赚钱吗培训中心网站建设方案