Создание конструкторов копирования в Java

JavaJavaBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии мы научимся создавать конструкторы копирования в Java. Конструкторы копирования используются для создания нового объекта с использованием значений существующего объекта. Конструкторы копирования могут быть использованы для создания поверхностных и глубоких клонов. Мы создадим конструкторы копирования для простых классов и классов с ссылками на типы.

Создайте простой класс

Создайте простой класс Student с полями name и gpa. Мы будем использовать этот класс для создания конструктора копирования.

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();
}

// Методы доступа
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());

Создайте класс с ссылками на типы

Создайте класс Student, который содержит ссылку на другой тип (Address) в качестве поля. Мы будем использовать этот класс, чтобы показать разницу между поверхностным и глубоким клонированием.

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());
}

// геттеры
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() и обсудили вопросы наследования в отношении конструкторов копирования. Создание конструкторов копирования - это элегантный и простой способ клонирования объектов.