21xrx.com
2024-05-20 17:27:26 Monday
登录
文章检索 我的文章 写文章
Java中的浅拷贝和深拷贝方法
2023-11-07 16:45:30 深夜i     --     --
Java 浅拷贝 深拷贝 方法

在Java中,拷贝对象是一种常见的操作。但是,在拷贝对象时,需要注意到拷贝方式的不同,可能会导致意想不到的结果。Java提供了两种拷贝方式:浅拷贝和深拷贝。

浅拷贝是指创建一个新对象,新对象的属性值和原始对象的属性值相同。但是,对于引用类型的属性,浅拷贝只是复制了引用地址,并没有复制其内容。这意味着,如果修改了新对象中的引用类型属性的值,原始对象的相应属性也会受到影响。可以通过实现Cloneable接口来实现浅拷贝,然后重写clone()方法。当调用clone()方法时,会返回一个新的浅拷贝对象。

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


public class Student implements Cloneable {

  private String name;

  private Courses course;

  public Student(String name, Courses course)

    this.name = name;

    this.course = course;

  

  public void setCourse(Courses course)

    this.course = course;

  

  public void display() {

    System.out.println("Name: " + name);

    System.out.println("Course: " + course.getName());

  }

  @Override

  protected Object clone() throws CloneNotSupportedException {

    return super.clone();

  }

}

public class Courses {

  private String name;

  public Courses(String name)

    this.name = name;

  

  public String getName()

    return name;

  

}

public class Main {

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

    Courses course = new Courses("Java Programming");

    Student student1 = new Student("John", course);

    Student student2 = (Student) student1.clone();

    student2.display();

    course.setName("Python Programming");

    student1.display();

    student2.display();

  }

}

运行上述代码,可以看到student1和student2对象的name属性值相同,course属性值也相同。但是,当修改course属性的值时,student1和student2对象的course属性值也会改变。这显示了浅拷贝的特性。

为了解决浅拷贝带来的问题,我们可以使用深拷贝。深拷贝是指创建一个新对象,新对象的属性值和原始对象的属性值相同。对于引用类型的属性,深拷贝会创建一个新的对象,并将其属性值进行复制。这样,即使修改新对象中的引用类型属性的值,原始对象的相应属性也不会受到任何影响。

可以通过实现Serializable接口来实现深拷贝。下面是一个使用深拷贝的示例代码:


import java.io.*;

public class Student implements Serializable {

  private String name;

  private Courses course;

  public Student(String name, Courses course)

    this.name = name;

    this.course = course;

  

  public void setCourse(Courses course)

    this.course = course;

  

  public void display() {

    System.out.println("Name: " + name);

    System.out.println("Course: " + course.getName());

  }

  public Student deepCopy() throws IOException, ClassNotFoundException {

    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

    ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);

    objectOutputStream.writeObject(this);

    ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());

    ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);

    return (Student) objectInputStream.readObject();

  }

}

public class Courses implements Serializable {

  private String name;

  public Courses(String name)

    this.name = name;

  

  public String getName()

    return name;

  

}

public class Main {

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

    Courses course = new Courses("Java Programming");

    Student student1 = new Student("John", course);

    Student student2 = student1.deepCopy();

    student2.display();

    course.setName("Python Programming");

    student1.display();

    student2.display();

  }

}

运行上述代码,可以看到student1和student2对象的name属性值相同,但是course属性值不同。即使修改了course属性的值,student2对象的course属性值也不会受到影响。这显示了深拷贝的特性。

综上所述,浅拷贝和深拷贝是Java中常用的拷贝方式。浅拷贝只会复制引用地址,而深拷贝会创建新的对象,并复制属性值。在使用拷贝操作时,我们应该根据需求选择适当的拷贝方式,以避免引发潜在的问题。

  
  

评论区

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