Java中如何进行对象复制呢?

戚薇 Java经验 发布时间:2023-06-21 10:29:35 阅读数:2944 1
下文笔者讲述Java中对象复制的方法及示例分享,如下所示

对象复制简介

对象复制:
   Java编程中的一个重要概念
   它涉及到对对象属性值的复制和传递

对于一个Java类
   开发者可通过定义构造器
      实现一个全新的对象
        或
      使用clone()方法进行对象复制
	    或
	  使用序列化和反序列化的方式
         将对象转换为字节流,再进行传递或复制

Java语言的对象复制类型:
     浅拷贝和深拷贝
     浅拷贝:
	    指创建一个新对象,并将原始对象的值复制到新对象
           但是对于引用类型,实际上复制的只是引用地址,即复制后的对象和原始对象指向同一个引用
     深拷贝:
	    对于引用类型,将引用也进行递归复制
           即将原始对象中的所有对象都进行复制

对象复制的常见操作方法

 
方式一:
   将一个对象的属性值复制到另一个对象中
方式二:
   在对象之间共享数据时,需要生成一份原始对象的拷贝 

二、对象复制的实现示例

1、构造函数实现对象复制

 
public class Person {
    private String name;
    private int age;
    
    public Person() {}
    
    public Person(Person other) {
        this.name = other.name;
        this.age = other.age;
    }
    
    //其他方法
}

2、Cloneable接口和clone()方法实现对象复制

Java中
   使用Cloneable接口和clone()方法进行对象复制

Cloneable接口:
   一个标记接口,用于标识该类的对象支持clone()方法
clone()方法:
   在Object中定义的方法,子类需要实现该方法来支持对象的克隆
    clone()方法的功能
	   创建并返回当前对象的一个副本
       与原对象相等的属性也都相等 
例:Cloneable接口和clone()方法的示例
public class Person implements Cloneable {
    private String name;
    private int age;
    
    public Person() {}
    
    public Person clone() throws CloneNotSupportedException {
        return (Person)super.clone();
    }
    
    //其他方法
}

3、序列化和反序列化实现对象复制

Java中
   还可以通过序列化和反序列化来实现对象复制

序列化的过程:
   将对象转换成字节流,后续通过反序列化将其还原回对象
例:序列化和反序列化示例
public class Person implements Serializable {
    private String name;
    private int age;
    
    public Person() {}
    
    public Person clone() throws CloneNotSupportedException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(this);
        oos.flush();
        oos.close();
         
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bis);
        Person copy = (Person)ois.readObject();
        ois.close();
        return copy;
    }
    
    //其他方法
}

三、浅拷贝和深拷贝

1、浅拷贝

浅拷贝:
  指将一个对象的值复制到一个新的对象中
    对于基本类型来说
    这种操作可以直接复制
     而对于引用类型来说
      只复制其引用地址
       而不会对其引用的对象进行复制 
例:浅拷贝
public class Person implements Cloneable {
    private String name;
    private int age;
    private list hobbies;
    
    public Person() {}
    
    public Person clone() throws CloneNotSupportedException {
        return (Person)super.clone();
    }
    
    //其他方法
}

2、深拷贝

深拷贝:
   指对于引用类型,递归地进行拷贝操作
    即对于原始对象的所有属性,都进行复制操作 
例:深拷贝
public class Person implements Cloneable {
    private String name;
    private int age;
    private List hobbies;
    
    public Person() {}
    
    public Person clone() throws CloneNotSupportedException {
        Person person = (Person)super.clone();
        List copyHobbies = new ArrayList<>();
        for(String hobby: this.hobbies) {
            copyHobbies.add(hobby);
        }
        person.hobbies = copyHobbies;
        return person;
    }
    
    //其他方法
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202306/16873146266856.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者