java的clone

本文介绍了Java中对象克隆的基本概念,包括浅克隆和深克隆的区别,并提供了实现这两种克隆的具体代码示例。文章还探讨了深克隆的两种实现方式:通过实现Cloneable接口并克隆引用类型字段,以及利用序列化机制进行克隆。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做项目时有时可能会遇到需要克隆对象的时候,因为有时候对象是直接从别的类get到的,那样引用的是一个对象,修改的话会将原先的对象也修改了。

java的浅克隆,十分简单。但是只会克隆基本的数据类型,当涉及到引用类型时就不好用了。

public class Employee implements Cloneable {
 private String name;
 private String gender;
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getGender() {
  return gender;
 }
 public void setGender(String gender) {
  this.gender = gender;
 }
 public Employee clone() throws CloneNotSupportedException {
  return (Employee) super.clone();
 }
}

实现深克隆的话有两种方法,一种就是引用的类也是实现了clone方法的。另一种是通过序列化来进行克隆。

第一种方法,需要将引用的类需要每个都clone。

public class Employee implements Cloneable {
 private String name;
 private String gender;
 private Date birthday;
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getGender() {
  return gender;
 }
 public void setGender(String gender) {
  this.gender = gender;
 }
 public Date getBirthday() {
  return birthday;
 }
 public void setBirthday(Date birthday) {
  this.birthday = birthday;
 }
 public Employee clone() throws CloneNotSupportedException {
  Employee cloned = (Employee) super.clone();
  cloned.birthday = (Date) birthday.clone();
  return cloned;
 }
}

第二种方法就不需要这么做了。

package clone;
import java.io.*;
import java.sql.Date;
public class Employee implements Serializable {
 private static final long serialVersionUID = 4435396040456359326L;
 private String name;
 private String gender;
 private Date birthday;
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getGender() {
  return gender;
 }
 public void setGender(String gender) {
  this.gender = gender;
 }
 public Date getBirthday() {
  return birthday;
 }
 public void setBirthday(Date birthday) {
  this.birthday = birthday;
 }
  
 public Object deepClone(Object obj) throws IOException, ClassNotFoundException {
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  ObjectOutputStream oos = new ObjectOutputStream(baos);
  oos.writeObject(obj);
  ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
  ObjectInputStream ois = new ObjectInputStream(bais);
  return ois.readObject();
 }
}

 

转载于:https://www.cnblogs.com/fu-yun/p/4552248.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值