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

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

Введение

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