La fel ca C++, Java sprijină de asemenea constructor de copiere . Dar în C++ este creat implicit. În timp ce în Java definim propriul constructor de copiere. În această secțiune, vom învăța constructor de copiere în Java cu un exemplu .
Constructor
În Java, a constructor este la fel ca o metodă, dar singura diferență este că constructorul are același nume ca și numele clasei. Este folosit pentru a crea o instanță a clasei. Este apelat automat atunci când creăm un obiect al clasei. Nu are niciun tip de returnare. Amintiți-vă că un constructor nu poate fi abstract , final , sincronizate , și static . Nu putem suprascrie un constructor. Ocupă ceva spațiu în memorie atunci când este apelat.
Tipuri de constructori
- Constructor implicit
- Constructor parametrizat
Cu excepția celor doi constructori de mai sus, Java acceptă și constructorul de copiere. Să o discutăm în detaliu.
De ce este necesar constructorul de copiere?
Uneori, ne confruntăm cu o problemă în care trebuia să creăm o copie exactă a unui obiect existent al clasei. Există, de asemenea, o condiție, dacă am făcut modificări în copie, aceasta nu ar trebui să se reflecte în cea originală și invers. Pentru astfel de cazuri, Java oferă conceptul de a constructor de copiere .
lista comparabila
Copie constructor
În Java, un constructor de copiere este un tip special de constructor care creează un obiect folosind un alt obiect din aceeași clasă Java. Returnează o copie duplicată a unui obiect existent al clasei.
Putem atribui o valoare câmpului final, dar același lucru nu se poate face în timpul utilizării metodei clone(). Este folosit dacă dorim să creăm o copie profundă a unui obiect existent. Este mai ușor de implementat în comparație cu metoda clone().
Notă: nu poate fi moștenit de subclase. Dacă încercăm să inițializam un obiect de clasă copil dintr-o referință de clasă părinte, ne confruntăm cu problema casting atunci când îl clonăm cu constructorul de copiere.
Utilizarea Copy Constructorului
Putem folosi constructorul de copiere dacă dorim să:
- Creați o copie a unui obiect care are mai multe câmpuri.
- Generați o copie profundă a obiectelor grele.
- Evitați utilizarea metodei Object.clone().
Avantajele Copy Constructor
- Dacă un câmp este declarat final, constructorul de copiere îl poate schimba.
- Nu este nevoie de tipărire.
- Utilizarea lui este mai ușoară dacă un obiect are mai multe câmpuri.
- Adăugarea unui câmp la clasă este ușoară din cauza asta. Trebuie să schimbăm numai în constructorul de copiere.
Crearea unui constructor de copiere
Pentru a crea un constructor de copiere în Java, urmați pașii de mai jos:
- Creați un constructor care acceptă un obiect din aceeași clasă ca parametru.
public class Fruits { private double price; private String name; //copy constructor public Fruits(Fruits fruits) { //getters } }
- Copiați fiecare obiect câmp (variabil) în instanța nou creată.
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 } }
Exemplu de constructor de copiere
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()); } }
Ieșire:
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
Copiați metoda constructorului vs clone().
Atât constructorul de copiere, cât și metoda clone() sunt folosite pentru a crea o copie a unui obiect existent al clasei. Dar utilizarea constructorului de copiere este mai ușoară și mai bună în comparație cu metoda clone() din motivele prezentate mai jos:
- Dacă folosim metoda clone() este necesar să importam Clonabil Metoda poate arunca o excepție CloneNotSupportException. Deci, gestionarea excepției într-un program este o sarcină complexă. În timp ce în constructorul de copiere nu există astfel de complexități.
- Nu putem atribui o valoare dacă câmpurile sunt final . În timp ce în constructorul de copiere, putem aloca valori câmpurilor finale.
- Obiectul returnat de metoda clone() trebuie să fie tipat . În timp ce în constructorul de copiere, nu există o astfel de cerință.