21xrx.com
2024-11-22 07:07:22 Friday
登录
文章检索 我的文章 写文章
Java中如何复制一个对象?
2023-06-14 21:24:17 深夜i     --     --
Java 复制对象 对象引用 Clone方法 CopyConstructor 序列化

在Java编程中,有时我们需要复制一个对象以便对其进行修改或保存原始副本。但是在Java中,直接赋值是将对象引用复制到新变量的过程,而不是复制对象本身。因此,要复制一个对象,需要使用一些技巧。下面我们将介绍三种方法来复制一个对象。

方法一:使用Clone方法

Clone方法是Java中一个用于复制对象的方法,在Cloneable接口中定义,不实现该接口的话会抛出CloneNotSupportedException,示例代码如下:


public class Person implements Cloneable {

  String name;

  int age;

  

  public Person(String name, int age)

    this.name = name;

    this.age = age;

  

  

  @Override

  public Person clone() throws CloneNotSupportedException {

    return (Person) super.clone();

  }

}

使用时只需要调用该对象的clone方法即可,示例代码如下:


Person p1 = new Person("Tom", 20);

Person p2 = null;

try {

  p2 = p1.clone();

} catch (CloneNotSupportedException e) {

  e.printStackTrace();

}

System.out.println(p1 == p2); // false,说明是不同的对象

p1.name = "Jerry";

System.out.println(p2.name); // Tom,说明p2的name属性没有被改变

方法二:使用CopyConstructor

CopyConstructor是一个构造函数,它将另一个对象传入作为参数,在这个构造函数内,我们可以将传入的对象的属性复制给新创建的对象,示例代码如下:


public class Person {

  String name;

  int age;

  

  public Person(String name, int age)

    this.name = name;

    this.age = age;

  

  

  public Person(Person p)

    this.name = p.name;

    this.age = p.age;

  

}

Person p1 = new Person("Tom", 20);

Person p2 = new Person(p1);

System.out.println(p1 == p2); // false,说明是不同的对象

p1.name = "Jerry";

System.out.println(p2.name); // Tom,说明p2的name属性没有被改变

方法三:使用序列化

利用Java的序列化,可以将对象写出到流中,再从流中读出一个新的对象,这个新的对象就是原对象的一个拷贝。 示例如下:


public static T copy(T obj) throws IOException, ClassNotFoundException {

  ByteArrayOutputStream bos = new ByteArrayOutputStream();

  ObjectOutputStream oos = new ObjectOutputStream(bos);

  oos.writeObject(obj);

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

  ObjectInputStream ois = new ObjectInputStream(bis);

  return (T) ois.readObject();

}

Person p1 = new Person("Tom", 20);

Person p2 = copy(p1);

System.out.println(p1 == p2); // false,说明是不同的对象

p1.name = "Jerry";

System.out.println(p2.name); // Tom,说明p2的name属性没有被改变

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复