java对象拷贝(代码示例)

qianduancss

温馨提示:这篇文章已超过239天没有更新,请注意相关的内容是否还可用!

java对象拷贝(代码示例)

Java中的对象拷贝是指创建一个新的对象,使其拥有与原始对象相同的属性值。对象拷贝可以通过两种方式实现:浅拷贝和深拷贝。

浅拷贝是指创建一个新对象,然后将原始对象的属性值复制给新对象。新对象和原始对象将共享相同的引用类型属性,即它们指向相同的内存地址。当修改新对象的引用类型属性时,原始对象的属性也会被修改。浅拷贝可以通过实现Cloneable接口并重写clone()方法来实现。

示例代码如下:

class Person implements Cloneable {

private String name;

private int age;

private Address address;

public Person(String name, int age, Address address) {

this.name = name;

this.age = age;

this.address = address;

}

public String getName() {

return name;

}

public int getAge() {

return age;

}

public Address getAddress() {

return address;

}

@Override

public Person clone() throws CloneNotSupportedException {

return (Person) super.clone();

}

}

class Address {

private String city;

public Address(String city) {

this.city = city;

}

public String getCity() {

return city;

}

}

public class Main {

public static void main(String[] args) throws CloneNotSupportedException {

Address address = new Address("Beijing");

Person person1 = new Person("Alice", 20, address);

Person person2 = person1.clone();

System.out.println(person1.getName()); // Alice

System.out.println(person2.getName()); // Alice

person2.getName().toUpperCase();

System.out.println(person1.getName()); // Alice

System.out.println(person2.getName()); // ALICE

System.out.println(person1.getAddress().getCity()); // Beijing

System.out.println(person2.getAddress().getCity()); // Beijing

person2.getAddress().city = "Shanghai";

System.out.println(person1.getAddress().getCity()); // Shanghai

System.out.println(person2.getAddress().getCity()); // Shanghai

}

}

深拷贝是指创建一个新对象,并将原始对象的属性值复制给新对象。新对象和原始对象拥有相同的属性值,但是它们指向不同的内存地址。当修改新对象的引用类型属性时,原始对象的属性不会被修改。深拷贝可以通过实现Serializable接口并使用序列化和反序列化来实现,或者通过手动递归拷贝对象的所有引用类型属性来实现。

示例代码如下:

import java.io.*;

class Person implements Serializable {

private String name;

private int age;

private Address address;

public Person(String name, int age, Address address) {

this.name = name;

this.age = age;

this.address = address;

}

public String getName() {

return name;

}

public int getAge() {

return age;

}

public Address getAddress() {

return address;

}

}

class Address implements Serializable {

private String city;

public Address(String city) {

this.city = city;

}

public String getCity() {

return city;

}

}

public class Main {

public static void main(String[] args) throws IOException, ClassNotFoundException {

Address address = new Address("Beijing");

Person person1 = new Person("Alice", 20, address);

// 使用序列化和反序列化进行深拷贝

ByteArrayOutputStream bos = new ByteArrayOutputStream();

ObjectOutputStream oos = new ObjectOutputStream(bos);

oos.writeObject(person1);

oos.flush();

ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());

ObjectInputStream ois = new ObjectInputStream(bis);

Person person2 = (Person) ois.readObject();

System.out.println(person1.getName()); // Alice

System.out.println(person2.getName()); // Alice

person2.getName().toUpperCase();

System.out.println(person1.getName()); // Alice

System.out.println(person2.getName()); // Alice

System.out.println(person1.getAddress().getCity()); // Beijing

System.out.println(person2.getAddress().getCity()); // Beijing

person2.getAddress().city = "Shanghai";

System.out.println(person1.getAddress().getCity()); // Beijing

System.out.println(person2.getAddress().getCity()); // Shanghai

}

}

以上示例代码中,浅拷贝通过调用`clone()`方法实现,深拷贝通过序列化和反序列化实现。通过修改新对象的引用类型属性,可以观察到浅拷贝和深拷贝的不同效果。

文章版权声明:除非注明,否则均为莫宇前端原创文章,转载或复制请以超链接形式并注明出处。

取消
微信二维码
微信二维码
支付宝二维码