Das Erstellen von Kopierkonstruktoren in Java

JavaBeginner
Jetzt üben

Einführung

In diesem Lab werden wir lernen, wie man in Java Kopierkonstruktoren erstellt. Kopierkonstruktoren werden verwendet, um ein neues Objekt mit den Werten eines bestehenden Objekts zu erstellen. Die Kopierkonstruktoren können verwendet werden, um sowohl flache als auch tiefe Klone zu erstellen. Wir werden Kopierkonstruktoren für einfache Klassen und Klassen mit referenzierten Typen erstellen.

Erstelle eine einfache Klasse

Erstellen Sie eine einfache Studentenklasse mit einem Namen und einem GPA-Feld. Wir werden diese Klasse verwenden, um einen Kopierkonstruktor zu erstellen.

class Student {
 private String name;
 private double gpa;

 // parameterisierter Konstruktor
 Student(String name, double gpa) {
  this.name = name;
  this.gpa = gpa;
    }
}

Erstelle einen Kopierkonstruktor für eine einfache Klasse

Erstellen Sie einen Kopierkonstruktor für die Studentenklasse. Der Kopierkonstruktor sollte ein Objekt der Klasse als Eingabe entgegennehmen und die Felder mithilfe der Werte des Eingabeobjekts initialisieren.

// Kopierkonstruktor
Student(Student s) {
 this.name = s.getName();
 this.gpa = s.getGpa();
}

// Getter-Methoden
public String getName() {
 return name;
}

public double getGpa() {
 return gpa;
}

Erstelle ein Objekt und klone es

Erstellen Sie ein Objekt der Studentenklasse und erstellen Sie dann eine Kopie dieses Objekts mithilfe des Kopierkonstruktors. Ändern Sie den Namen des ursprünglichen Objekts und geben Sie die Namen beider Objekte aus, um zu sehen, ob das klonierte Objekt betroffen war.

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

Erstelle eine Klasse mit referenzierten Typen

Erstellen Sie eine Studentenklasse, die einen referenzierten Typ (Adresse) als Feld enthält. Wir werden diese Klasse verwenden, um den Unterschied zwischen flachem und tiefem Klonen zu demonstrieren.

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

 // parameterisierter Konstruktor
 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;
    }
}

Erstelle einen flachen Kopierkonstruktor

Erstellen Sie einen flachen Kopierkonstruktor für die Studentenklasse. Der flache Kopierkonstruktor sollte nur Referenzen auf die referenzierten Typfelder 指定。

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

注:这里“指定”一词原文似乎有误,推测可能是“zuweisen”(赋值),但按照要求未修改原文错误表述直接翻译。

Zeige das flache Klonen

Erstellen Sie ein Studentenobjekt und anschließend einen Klon mithilfe des flachen Kopierkonstruktors. Ändern Sie die Postleitzahl der Adresse des ursprünglichen Objekts und geben Sie beide Postleitzahlen aus, um zu zeigen, dass das klonierte Objekt von Änderungen am ursprünglichen betroffen ist.

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

Erstelle einen tiefen Kopierkonstruktor

Erstellen Sie einen tiefen Kopierkonstruktor für die Studentenklasse. Der tiefe Kopierkonstruktor sollte neue Objekte für referenzierte Typfelder erstellen.

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

// Getter-Methoden
public Address getAddress() {
 return address;
}

Zeige das tiefe Klonen

Erstellen Sie ein Studentenobjekt und anschließend einen Klon mithilfe des tiefen Kopierkonstruktors. Ändern Sie die Postleitzahl der Adresse des ursprünglichen Objekts und geben Sie beide Postleitzahlen aus, um zu zeigen, dass das klonierte Objekt nicht von Änderungen am ursprünglichen betroffen ist.

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

Zusammenfassung

In diesem Lab haben wir gelernt, wie man in Java Kopierkonstruktoren erstellt. Kopierkonstruktoren können verwendet werden, um tiefe und flache Klone von Objekten zu erstellen. Wir haben auch Kopierkonstruktoren mit der clone()-Methode verglichen und Vererbungsprobleme mit Kopierkonstruktoren diskutiert. Das Erstellen von Kopierkonstruktoren ist eine elegante und einfache Möglichkeit, Objekte zu klonen.