在 Java 中创建拷贝构造函数

JavaJavaBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("`Java`")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["`Object-Oriented and Advanced Concepts`"]) java(("`Java`")) -.-> java/SystemandDataProcessingGroup(["`System and Data Processing`"]) java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("`Classes/Objects`") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/class_attributes("`Class Attributes`") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/constructors("`Constructors`") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/encapsulation("`Encapsulation`") java/SystemandDataProcessingGroup -.-> java/object_methods("`Object Methods`") subgraph Lab Skills java/classes_objects -.-> lab-117400{{"`在 Java 中创建拷贝构造函数`"}} java/class_attributes -.-> lab-117400{{"`在 Java 中创建拷贝构造函数`"}} java/constructors -.-> lab-117400{{"`在 Java 中创建拷贝构造函数`"}} java/encapsulation -.-> lab-117400{{"`在 Java 中创建拷贝构造函数`"}} java/object_methods -.-> lab-117400{{"`在 Java 中创建拷贝构造函数`"}} end

创建一个简单类

创建一个简单的 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() 方法,并讨论了拷贝构造函数在继承中的问题。创建拷贝构造函数是一种优雅且简单的对象克隆方式。

您可能感兴趣的其他 Java 教程