0
点赞
收藏
分享

微信扫一扫

java 复制对象

Java复制对象的方法介绍

在Java中,复制对象是指创建一个与原始对象具有相同状态的新对象。复制对象可以用于多种原因,如备份对象、传递对象的副本等。在本文中,我们将介绍几种常见的复制对象的方法,并提供相应的代码示例。

1. 浅拷贝

浅拷贝是指复制对象时,只复制对象的基本类型成员变量值,而不复制引用类型成员变量。这意味着新对象和原始对象将共享引用类型成员变量,对其中一个对象的修改将影响到另一个对象。

下面是一个使用浅拷贝的代码示例:

public class Person implements Cloneable {
    private String name;
    private List<String> hobbies;

    // 构造函数和其他代码省略

    // 重写clone方法
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

// 使用浅拷贝
Person person1 = new Person("Alice", Arrays.asList("reading", "painting"));
Person person2 = (Person) person1.clone();

person2.setName("Bob");
person2.getHobbies().add("swimming");

System.out.println(person1.getName()); // Alice
System.out.println(person2.getName()); // Bob
System.out.println(person1.getHobbies()); // [reading, painting, swimming]
System.out.println(person2.getHobbies()); // [reading, painting, swimming]

从上面的示例中可以看出,当我们修改person2的name属性时,person1的name属性没有受到影响。但是,当我们向person2的hobbies列表中添加一个新的爱好时,person1的hobbies列表也发生了变化,这是因为它们共享了同一个引用类型成员变量。

2. 深拷贝

深拷贝是指复制对象时,不仅复制对象的基本类型成员变量,还复制引用类型成员变量。这样,新对象和原始对象将拥有独立的副本,对其中一个对象的修改不会影响到另一个对象。

下面是一个使用深拷贝的代码示例:

public class Person implements Cloneable {
    private String name;
    private List<String> hobbies;

    // 构造函数和其他代码省略

    // 重写clone方法
    @Override
    public Object clone() throws CloneNotSupportedException {
        Person clone = (Person) super.clone();
        clone.hobbies = new ArrayList<>(hobbies);
        return clone;
    }
}

// 使用深拷贝
Person person1 = new Person("Alice", Arrays.asList("reading", "painting"));
Person person2 = (Person) person1.clone();

person2.setName("Bob");
person2.getHobbies().add("swimming");

System.out.println(person1.getName()); // Alice
System.out.println(person2.getName()); // Bob
System.out.println(person1.getHobbies()); // [reading, painting]
System.out.println(person2.getHobbies()); // [reading, painting, swimming]

从上面的示例中可以看出,当我们修改person2的name属性时,person1的name属性没有受到影响。并且,当我们向person2的hobbies列表中添加一个新的爱好时,person1的hobbies列表保持不变,这是因为它们拥有独立的副本。

3. 使用序列化实现深拷贝

另一种实现深拷贝的方法是使用Java的序列化机制。通过将对象写入一个字节流,然后从字节流中读取对象,可以创建一个新对象的独立副本。

下面是一个使用序列化实现深拷贝的代码示例:

import java.io.*;

public class Person implements Serializable {
    private String name;
    private List<String> hobbies;

    // 构造函数和其他代码省略

    // 使用序列化实现深拷贝
    public Person deepCopy() throws IOException, ClassNotFoundException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(this);

        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bais);
        return (Person) ois.readObject();
    }
}

// 使用序列化实现深拷贝
Person person1 = new Person("Alice", Arrays.asList("reading", "painting"));
Person
举报

相关推荐

0 条评论