logo

Przykład konstruktora kopiującego Java

Podobnie jak C++, Jawa obsługuje również konstruktor kopiujący . Ale w C++ jest tworzony domyślnie. W Javie definiujemy własny konstruktor kopiujący. W tej części nauczymy się konstruktor kopiujący w Javie z przykładem .

Konstruktor

Na Jawie A konstruktor jest tym samym co metoda, ale jedyną różnicą jest to, że konstruktor ma taką samą nazwę jak nazwa klasy. Służy do tworzenia instancji klasy. Wywoływana jest automatycznie, gdy tworzymy obiekt klasy. Nie ma typu powrotu. Pamiętaj, że konstruktor nie może być abstrakcyjny , finał , zsynchronizowane , I statyczny . Nie możemy zastąpić konstruktora. Po wywołaniu zajmuje trochę miejsca w pamięci.

Rodzaje konstruktorów

  • Domyślny konstruktor
  • Konstruktor parametryczny

Z wyjątkiem dwóch powyższych konstruktorów, Java obsługuje także konstruktor kopiujący. Omówmy to szczegółowo.

Dlaczego wymagany jest konstruktor kopiujący?

Czasami napotykamy problem polegający na utworzeniu dokładnej kopii istniejącego obiektu klasy. Jest też warunek, że jeżeli dokonaliśmy jakichkolwiek zmian w kopii, to nie powinno to odzwierciedlać się w oryginale i odwrotnie. W takich przypadkach Java udostępnia koncepcję a konstruktor kopiujący .

jak przekonwertować ciąg na int w Javie

Kopiuj konstruktor

W Javie konstruktor kopiujący to specjalny typ konstruktora, który tworzy obiekt przy użyciu innego obiektu tej samej klasy Java. Zwraca zduplikowaną kopię istniejącego obiektu klasy.

Do ostatniego pola możemy przypisać wartość, ale nie da się tego zrobić przy użyciu metody clone(). Stosuje się go, jeśli chcemy stworzyć głęboką kopię istniejącego obiektu. Jest łatwiejsza do wdrożenia w porównaniu z metodą clone().

Uwaga: nie może być dziedziczona przez podklasy. Jeśli spróbujemy zainicjować obiekt klasy podrzędnej z odwołania do klasy nadrzędnej, napotkamy problem rzutowania podczas klonowania go za pomocą konstruktora kopiującego.

Użycie konstruktora kopiującego

Możemy użyć konstruktora kopiującego, jeśli chcemy:

  • Utwórz kopię obiektu, który ma wiele pól.
  • Wygeneruj głęboką kopię ciężkich obiektów.
  • Unikaj stosowania metody Object.clone().

Zalety konstruktora kopiującego

  • Jeśli pole zadeklarowano jako ostateczne, konstruktor kopiujący może je zmienić.
  • Nie ma potrzeby typowania.
  • Jego użycie jest łatwiejsze, jeśli obiekt ma kilka pól.
  • Dzięki temu dodanie pola do klasy jest proste. Musimy zmienić tylko w konstruktorze kopiującym.

Tworzenie konstruktora kopiującego

Aby utworzyć konstruktor kopiujący w Javie, wykonaj poniższe czynności:

  • Utwórz konstruktor, który jako parametr akceptuje obiekt tej samej klasy.
 public class Fruits { private double price; private String name; //copy constructor public Fruits(Fruits fruits) { //getters } } 
  • Skopiuj każdy obiekt pola (zmiennej) do nowo utworzonej instancji.
 public class Fruits { private double price; private String name; //copy constructor public Fruits(Fruits fruits) { //copying each filed this.price = fruits.price; //getter this.name = fruits.name; //getter } } 

Przykład konstruktora kopiującego

CopyConstructorExample.java

 public class Fruit { private double fprice; private String fname; //constructor to initialize roll number and name of the student Fruit(double fPrice, String fName) { fprice = fPrice; fname = fName; } //creating a copy constructor Fruit(Fruit fruit) { System.out.println('
After invoking the Copy Constructor:
'); fprice = fruit.fprice; fname = fruit.fname; } //creating a method that returns the price of the fruit double showPrice() { return fprice; } //creating a method that returns the name of the fruit String showName() { return fname; } //class to create student object and print roll number and name of the student public static void main(String args[]) { Fruit f1 = new Fruit(399, 'Ruby Roman Grapes'); System.out.println('Name of the first fruit: '+ f1.showName()); System.out.println('Price of the first fruit: '+ f1.showPrice()); //passing the parameters to the copy constructor Fruit f2 = new Fruit(f1); System.out.println('Name of the second fruit: '+ f2.showName()); System.out.println('Price of the second fruit: '+ f2.showPrice()); } } 

Wyjście:

 Name of the first fruit: Ruby Roman Grapes Price of the first fruit: 399.0 After invoking the Copy Constructor: Name of the second fruit: Ruby Roman Grapes Price of the second fruit: 399.0 

Kopiuj konstruktor kontra metoda clone().

Zarówno konstruktor kopiujący, jak i metoda clone() służą do tworzenia kopii istniejącego obiektu klasy. Jednak użycie konstruktora kopiującego jest łatwiejsze i lepsze w porównaniu z metodą clone() z powodów podanych poniżej:

  • Jeśli używamy metody clone() konieczne jest zaimportowanie pliku Możliwość klonowania Metoda może zgłosić wyjątek Wyjątek CloneNotSupportException. Zatem obsługa wyjątku w programie jest zadaniem złożonym. Podczas gdy w konstruktorze kopiującym nie ma takich zawiłości.
  • Nie możemy przypisać wartości, jeśli pola są finał . Będąc w konstruktorze kopiującym możemy przypisać wartości do końcowych pól.
  • Obiekt zwrócony przez metodę clone() musi być dawać podobne role aktor . Podczas gdy w konstruktorze kopiującym nie ma takiego wymogu.