专业的JAVA编程教程与资源

网站首页 > java教程 正文

java对象深拷贝和浅拷贝(java对象深拷贝和浅拷贝一样吗)

temp10 2024-10-19 14:54:29 java教程 12 ℃ 0 评论
  1. 浅拷贝(Shallow Copy):
    创建一个新对象,这个对象有着原始对象的一些基本数据类型的字段的拷贝,但是引用类型字段深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是两种常见的对象复制方式,它们在Java中的实现原理如下:
  2. 浅拷贝(Shallow Copy)

浅拷贝是指创建一个新对象,然后将原始对象的非静态字段复制到新对象中。如果字段是值类型,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象。因此,原始对象和新对象引用同一个对象。

在Java中,可以通过实现Cloneable接口并重写clone()方法来实现浅拷贝。例如:

java对象深拷贝和浅拷贝(java对象深拷贝和浅拷贝一样吗)

public class Person implements Cloneable {  
    private String name;  
    private int age;  
    private Address address;  
  
    // 构造函数、getter和setter方法省略  
  
    @Override  
    public Person clone() {  
        try {  
            return (Person) super.clone();  
        } catch (CloneNotSupportedException e) {  
            e.printStackTrace();  
            return null;  
        }  
    }  
}

在上面的代码中,Person类实现了Cloneable接口并重写了clone()方法。在clone()方法中,调用了super.clone()方法来创建一个新对象,并将原始对象的非静态字段复制到新对象中。注意,Address类型的字段address只是复制了引用,而没有复制引用的对象。

  1. 深拷贝(Deep Copy)

深拷贝是指创建一个新对象,并将原始对象的所有字段都复制到新对象中。如果字段是值类型,则对该字段执行逐位复制。如果字段是引用类型,则复制引用的对象。因此,原始对象和新对象是完全独立的。

在Java中,深拷贝可以通过序列化(Serialization)来实现。具体实现步骤如下:

(1)让需要深拷贝的类实现Serializable接口;

(2)将原始对象写入到字节流中;

(3)从字节流中读取对象。

例如:

public class Person implements Serializable {  
    private static final long serialVersionUID = 1L;  
    private String name;  
    private int age;  
    private Address address;  
  
    // 构造函数、getter和setter方法省略  
  
    public Person deepCopy() {  
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();  
        ObjectOutputStream objectOutputStream = null;  
        ObjectInputStream objectInputStream = null;  
        try {  
            objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);  
            objectOutputStream.writeObject(this);  
            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());  
            objectInputStream = new ObjectInputStream(byteArrayInputStream);  
            return (Person) objectInputStream.readObject();  
        } catch (IOException | ClassNotFoundException e) {  
            e.printStackTrace();  
            return null;  
        } finally {  
            try {  
                if (objectOutputStream != null) {  
                    objectOutputStream.close();  
                }  
                if (objectInputStream != null) {  
                    objectInputStream.close();  
                }  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
}

在上面的代码中,Person类实现了Serializable接口,并实现了deepCopy()方法来进行深拷贝。在deepCopy()方法中,首先将原始对象写入到字节流中,然后从字节流中读取对象并返回。注意,Address类型的字段address也被复制了一份,因此原始对象和新对象是完全独立的。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表