Clonarea obiectelor se referă la crearea unei copii exacte a unui obiect. Acesta creează o nouă instanță a clasei obiectului curent și inițializează toate câmpurile acestuia cu exact conținutul câmpurilor corespunzătoare acestui obiect.
Metode pentru efectuarea clonării obiectelor în Java
Există 3 metode pentru a crea Clonarea obiectelor în Java, care sunt menționate mai jos:
- Utilizarea Assignment Operator pentru a crea o copie a variabilei de referință
- Crearea unei copii folosind metoda clone().
- Utilizarea metodei clone() – Deep Copy
1. Folosind Assignment Operator pentru a crea a copie a variabila de referinta
În Java, nu există niciun operator care să creeze o copie a unui obiect. Spre deosebire de C++, în Java, dacă folosim operatorul de atribuire, atunci acesta va crea o copie a variabilei de referință și nu a obiectului. Acest lucru poate fi explicat luând un exemplu. Următorul program demonstrează același lucru.
Mai jos este implementarea subiectului de mai sus:
Java
setările browserului web
// Java program to demonstrate that assignment operator> // only creates a new reference to same object> import> java.io.*;> > // A test class whose objects are cloned> class> Test {> >int> x, y;> >Test()> >{> >x =>10>;> >y =>20>;> >}> }> > // Driver Class> class> Main {> >public> static> void> main(String[] args)> >{> >Test ob1 =>new> Test();> > >System.out.println(ob1.x +>' '> + ob1.y);> > >// Creating a new reference variable ob2> >// pointing to same address as ob1> >Test ob2 = ob1;> > >// Any change made in ob2 will> >// be reflected in ob1> >ob2.x =>100>;> > >System.out.println(ob1.x +>' '> + ob1.y);> >System.out.println(ob2.x +>' '> + ob2.y);> >}> }> |
fmovies
>
>Ieșire
10 20 100 20 100 20>
2. Crearea unei copii folosind metoda clone().
Clasa a cărei copie a obiectului urmează să fie făcută trebuie să aibă o metodă publică de clonare în ea sau într-una dintre clasele sale părinte.
- Fiecare clasă care implementează clone() ar trebui să apeleze super.clone() pentru a obține referința la obiectul clonat.
- Clasa trebuie, de asemenea, să implementeze interfața java.lang.Cloneable a cărei clonă de obiect dorim să o creăm, altfel va arunca CloneNotSupportedException atunci când metoda clonării este apelată pe obiectul acelei clase.
Sintaxă:
protected Object clone() throws CloneNotSupportedException>
i) Utilizarea metodei clone() -Shallow Copy
Notă – În exemplul de cod de mai jos, metoda clone() creează un obiect complet nou cu o valoare hashCode diferită, ceea ce înseamnă că se află într-o locație de memorie separată. Dar datorită faptului că obiectul Test c este în interiorul Test2, tipurile primitive au obținut o copie profundă, dar acest obiect Test c este încă partajat între t1 și t2. Pentru a depăși acest lucru, facem în mod explicit o copie profundă pentru variabila obiect c, care este discutată mai târziu.
funcțiile arduino
Java
// A Java program to demonstrate> // shallow copy using clone()> import> java.util.ArrayList;> > // An object reference of this class is> // contained by Test2> class> Test {> >int> x, y;> }> > // Contains a reference of Test and> // implements clone with shallow copy.> class> Test2>implements> Cloneable {> >int> a;> >int> b;> >Test c =>new> Test();> >public> Object clone()>throws> CloneNotSupportedException> >{> >return> super>.clone();> >}> }> > // Driver class> public> class> Main {> >public> static> void> main(String args[])> >throws> CloneNotSupportedException> >{> >Test2 t1 =>new> Test2();> >t1.a =>10>;> >t1.b =>20>;> >t1.c.x =>30>;> >t1.c.y =>40>;> > >Test2 t2 = (Test2)t1.clone();> > >// Creating a copy of object t1> >// and passing it to t2> >t2.a =>100>;> > >// Change in primitive type of t2 will> >// not be reflected in t1 field> >t2.c.x =>300>;> > >// Change in object type field will be> >// reflected in both t2 and t1(shallow copy)> >System.out.println(t1.a +>' '> + t1.b +>' '> + t1.c.x> >+>' '> + t1.c.y);> >System.out.println(t2.a +>' '> + t2.b +>' '> + t2.c.x> >+>' '> + t2.c.y);> >}> }> |
salvare video youtube vlc
>
>Ieșire
10 20 300 40 100 20 300 40>
În exemplul de mai sus, t1.clone returnează copia superficială a obiectului t1. Pentru a obține o copie profundă a obiectului, anumite modificări trebuie făcute în metoda clonării după obținerea copiei.
ii) Utilizarea metodei clone() – Deep Copy
- Dacă dorim să creăm o copie profundă a obiectului X și să o plasăm într-un nou obiect Y, atunci se creează o nouă copie a oricăror câmpuri de obiecte de referință și aceste referințe sunt plasate în obiectul Y. Aceasta înseamnă orice modificări făcute în câmpurile obiectului de referință din obiect. X sau Y se vor reflecta doar în acel obiect și nu în celălalt. În exemplul de mai jos, creăm o copie profundă a obiectului.
- O copie profundă copiază toate câmpurile și face copii ale memoriei alocate dinamic la care sunt indicate câmpurile. O copie profundă apare atunci când un obiect este copiat împreună cu obiectele la care se referă.
Java
// A Java program to demonstrate> // deep copy using clone()> > // An object reference of this> // class is contained by Test2> class> Test {> >int> x, y;> }> > // Contains a reference of Test and> // implements clone with deep copy.> class> Test2>implements> Cloneable {> >int> a, b;> > >Test c =>new> Test();> > >public> Object clone()>throws> CloneNotSupportedException> >{> >// Assign the shallow copy to> >// new reference variable t> >Test2 t = (Test2)>super>.clone();> > >// Creating a deep copy for c> >t.c =>new> Test();> >t.c.x = c.x;> >t.c.y = c.y;> > >// Create a new object for the field c> >// and assign it to shallow copy obtained,> >// to make it a deep copy> >return> t;> >}> }> > public> class> Main {> >public> static> void> main(String args[])> >throws> CloneNotSupportedException> >{> >Test2 t1 =>new> Test2();> >t1.a =>10>;> >t1.b =>20>;> >t1.c.x =>30>;> >t1.c.y =>40>;> > >Test2 t3 = (Test2)t1.clone();> >t3.a =>100>;> > >// Change in primitive type of t2 will> >// not be reflected in t1 field> >t3.c.x =>300>;> > >// Change in object type field of t2 will> >// not be reflected in t1(deep copy)> >System.out.println(t1.a +>' '> + t1.b +>' '> + t1.c.x> >+>' '> + t1.c.y);> >System.out.println(t3.a +>' '> + t3.b +>' '> + t3.c.x> >+>' '> + t3.c.y);> >}> }> |
>
>
scorul de precizie sklearnIeșire
10 20 30 40 100 20 300 40>
În exemplul de mai sus, putem vedea că un nou obiect pentru clasa Test a fost atribuit pentru a copia un obiect care va fi returnat la metoda clonării. Datorită acestui fapt, t3 va obține o copie profundă a obiectului t1. Deci, orice modificări făcute în câmpurile obiectului „c” de către t3, nu vor fi reflectate în t1.
Deep Copy vs Shallow Copy
Există anumite diferențe între utilizarea clone() ca o copie profundă față de aceea ca o copie superficială, așa cum este menționat mai jos:
- Copie superficială este metoda de copiere a unui obiect și este urmată implicit în clonare. În această metodă, câmpurile unui obiect vechi X sunt copiate în noul obiect Y. În timpul copierii câmpului tip obiect, referința este copiată în Y, adică obiectul Y va indica aceeași locație indicată de X. Dacă valoarea câmpului este un tip primitiv, copiază valoarea tipului primitiv.
- Prin urmare, orice modificări făcute în obiectele referite în obiectul X sau Y se vor reflecta în alte obiecte.
Copiile superficiale sunt ieftine și simplu de făcut. În exemplul de mai sus, am creat o copie superficială a cel obiect.
De ce să folosiți metoda clonării() sau Avantajele metodei Clone
- Dacă folosim operatorul de atribuire pentru a atribui o referință de obiect unei alte variabile de referință, atunci aceasta va indica aceeași locație de adresă a obiectului vechi și nu va fi creată nicio copie nouă a obiectului. Din acest motiv, orice modificare a variabilei de referință se va reflecta în obiectul original.
- Dacă folosim un constructor de copiere, atunci trebuie să copiem toate datele în mod explicit, adică trebuie să reatribuim în mod explicit toate câmpurile clasei din constructor. Dar în metoda clonării, această muncă de creare a unei noi copii se face prin metoda însăși. Deci, pentru a evita procesarea suplimentară, folosim clonarea obiectelor.