在 Java 中创建拷贝构造函数

JavaBeginner
立即练习

介绍

在本实验中,我们将学习如何在 Java 中创建拷贝构造函数(Copy Constructor)。拷贝构造函数用于通过现有对象的值来创建一个新对象。拷贝构造函数可用于创建浅拷贝(Shallow Clone)和深拷贝(Deep Clone)。我们将为简单类以及包含引用类型的类创建拷贝构造函数。

创建一个简单类

创建一个简单的 Student 类,包含 nameGPA 字段。我们将使用这个类来创建拷贝构造函数。

class Student {
 private String name;
 private double gpa;

 // 带参数的构造函数
 Student(String name, double gpa) {
  this.name = name;
  this.gpa = gpa;
    }
}

为简单类创建拷贝构造函数

Student 类创建一个拷贝构造函数。拷贝构造函数应接受一个该类的对象作为输入,并使用输入对象的值来初始化字段。

// 拷贝构造函数
Student(Student s) {
 this.name = s.getName();
 this.gpa = s.getGpa();
}

// getters
public String getName() {
 return name;
}

public double getGpa() {
 return gpa;
}

创建对象并克隆

创建一个 Student 类的对象,然后使用拷贝构造函数创建该对象的克隆。修改原始对象的名称,并打印两个对象的名称,以查看克隆对象是否受到影响。

Student s = new Student("John", 3.5);
Student s2 = new Student(s);

s.setName("Sarah");

System.out.println("Original: " + s.getName());
System.out.println("Clone: " + s2.getName());

创建包含引用类型的类

创建一个包含引用类型(Address)作为字段的 Student 类。我们将使用这个类来演示浅拷贝和深拷贝的区别。

class Student {
 private String name;
 private double gpa;
 private Address address;

 // 带参数的构造函数
 Student(String name, double gpa, Address address) {
  this.name = name;
  this.gpa = gpa;
  this.address = address;
 }
}

class Address {
 private int postalCode;

 Address(int postalCode) {
  this.postalCode = postalCode;
    }
}

创建浅拷贝构造函数

Student 类创建一个浅拷贝构造函数。浅拷贝构造函数应仅为引用类型字段分配引用。

Student(Student s) {
 this.name = s.getName();
 this.gpa = s.getGpa();
 this.address = s.getAddress();
}

演示浅克隆

创建一个 Student 对象,然后使用浅拷贝构造函数创建其克隆。修改原始对象地址的邮政编码,并打印两个对象的邮政编码,以展示克隆对象是否受到原始对象更改的影响。

Student s = new Student("John", 3.5, new Address(12345));
Student s2 = new Student(s);

s.getAddress().setPostalCode(54321);

System.out.println("Original: " + s.getAddress().getPostalCode());
System.out.println("Clone: " + s2.getAddress().getPostalCode());

创建深拷贝构造函数

Student 类创建一个深拷贝构造函数。深拷贝构造函数应为引用类型字段创建新的对象。

Student(Student s) {
 this.name = s.getName();
 this.gpa = s.getGpa();
 this.address = new Address(s.getAddress().getPostalCode());
}

// getters
public Address getAddress() {
 return address;
}

演示深克隆

创建一个 Student 对象,然后使用深拷贝构造函数创建其克隆。修改原始对象地址的邮政编码,并打印两个对象的邮政编码,以展示克隆对象是否受到原始对象更改的影响。

Student s = new Student("John", 3.5, new Address(12345));
Student s2 = new Student(s);

s.getAddress().setPostalCode(54321);

System.out.println("Original: " + s.getAddress().getPostalCode());
System.out.println("Clone: " + s2.getAddress().getPostalCode());

总结

在本实验中,我们学习了如何在 Java 中创建拷贝构造函数。拷贝构造函数可用于创建对象的深拷贝和浅拷贝。我们还比较了拷贝构造函数与 clone() 方法,并讨论了拷贝构造函数在继承中的问题。创建拷贝构造函数是一种优雅且简单的对象克隆方式。