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



