logo

Klonēšanas () metode Java valodā

Objektu klonēšana attiecas uz precīzas objekta kopijas izveidi. Tas izveido jaunu pašreizējā objekta klases instanci un inicializē visus tā laukus tieši ar šī objekta atbilstošo lauku saturu.

Metodes objektu klonēšanai Java

Ir 3 metodes, kā izveidot objektu klonēšanu Java, kas ir minētas tālāk:

  1. Piešķiršanas operatora izmantošana, lai izveidotu atsauces mainīgā kopiju
  2. Kopijas izveide, izmantojot metodi clone()
  3. Klona() metodes izmantošana – Deep Copy

1. Izmantojot Piešķiršanas operatoru, lai izveidotu a kopija atsauces mainīgais

Java valodā nav operatora, kas izveidotu objekta kopiju. Atšķirībā no C++, Java, ja mēs izmantojam piešķiršanas operatoru, tas izveidos atsauces mainīgā kopiju, nevis objektu. To var izskaidrot ar piemēru. Nākamā programma parāda to pašu.



bash cits, ja

Zemāk ir aprakstīta iepriekš minētās tēmas īstenošana:

Java




// 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
>

Izvade

10 20 100 20 100 20>

2. Kopijas izveide, izmantojot clone() metodi

Klasei, kuras objekta kopija ir jāizveido, tajā vai vienā no tās vecākklasēm ir jābūt publiskai klona metodei.

  • Katrai klasei, kas ievieš clone() ir jāizsauc super.clone(), lai iegūtu klonētā objekta atsauci.
  • Klasei ir jāievieš arī interfeiss java.lang.Cloneable, kura objekta klonu mēs vēlamies izveidot, pretējā gadījumā tas izsauks CloneNotSupportedException, kad šīs klases objektā tiks izsaukta klona metode.

Sintakse:

protected Object clone() throws CloneNotSupportedException>

i) Klona() metodes izmantošana - Sekla kopija

Piezīme - Tālāk redzamajā koda piemērā metode clone () izveido pilnīgi jaunu objektu ar atšķirīgu hashCode vērtību, kas nozīmē, ka tas atrodas atsevišķā atmiņas vietā. Bet tā kā Testa objekts c atrodas Test2 iekšienē, primitīvie tipi ir sasnieguši dziļu kopiju, taču šis testa objekts c joprojām ir kopīgs starp t1 un t2. Lai to novērstu, mēs skaidri veicam objekta mainīgā c dziļo kopiju, kas tiks apspriests vēlāk.

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

>

>

Izvade

10 20 300 40 100 20 300 40>

Iepriekš minētajā piemērā t1.clone atgriež seklu objekta t1 kopiju. Lai iegūtu objekta dziļu kopiju, pēc kopijas iegūšanas ir jāveic noteiktas modifikācijas klona metodē.

ii) Klona() metodes izmantošana – dziļā kopija

  • Ja mēs vēlamies izveidot objekta X dziļu kopiju un ievietot to jaunā objektā Y, tad tiek izveidota jauna kopija visiem norādītajiem objektu laukiem un šīs atsauces tiek ievietotas objektā Y. Tas nozīmē visas izmaiņas, kas veiktas objekta atsauces objekta laukos. X vai Y tiks atspoguļots tikai šajā objektā, nevis citā. Tālāk esošajā piemērā mēs izveidojam dziļu objekta kopiju.
  • Dziļā kopija kopē visus laukus un veido dinamiski piešķirtās atmiņas kopijas, uz kurām norāda lauki. Dziļā kopija rodas, kad objekts tiek kopēts kopā ar objektiem, uz kuriem tas attiecas.

Java


arduino funkcijas



kāda ir atšķirība starp megabaitu un gigabaitu

// 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);> >}> }>

>

>

Izvade

10 20 30 40 100 20 300 40>

Iepriekš minētajā piemērā mēs redzam, ka ir piešķirts jauns tests klases objekts, lai kopētu objektu, kas tiks atgriezts klonēšanas metodē. Sakarā ar to t3 iegūs dziļu objekta t1 kopiju. Tātad visas izmaiņas, ko t3 veikušas objekta “c” laukos, netiks atspoguļotas t1.

Dziļa kopija pret seklu kopiju

Pastāv noteiktas atšķirības starp klona () izmantošanu kā dziļu kopiju un kā seklu kopiju, kā minēts tālāk:

  • Sekla kopija ir objekta kopēšanas metode, un pēc noklusējuma tiek izmantota klonēšana. Izmantojot šo metodi, vecā objekta X lauki tiek kopēti uz jauno objektu Y. Kopējot objekta tipa lauku, atsauce tiek kopēta uz Y, t.i., objekts Y norādīs uz to pašu vietu, uz kuru norāda X. Ja lauka vērtība ir primitīvs tips, tas kopē primitīvā tipa vērtību.
  • Tāpēc visas izmaiņas, kas veiktas objektos, uz kuriem attiecas atsauce objektā X vai Y, tiks atspoguļoti citos objektos.

Seklas kopijas ir lētas un vienkārši izgatavojamas. Iepriekš minētajā piemērā mēs izveidojām seklu kopiju uz objektu.

Kāpēc izmantot klona metodi() vai Klonēšanas metodes priekšrocības

  • Ja mēs izmantojam piešķiršanas operatoru, lai piešķirtu objekta atsauci citam atsauces mainīgajam, tas norādīs uz to pašu vecā objekta adreses atrašanās vietu un netiks izveidota jauna objekta kopija. Sakarā ar to visas atsauces mainīgā izmaiņas tiks atspoguļotas sākotnējā objektā.
  • Ja mēs izmantojam kopēšanas konstruktoru, mums ir skaidri jākopē visi dati, t.i., mums ir skaidri jāpiešķir visi klases lauki konstruktorā. Bet klona metodē šo jaunas kopijas izveides darbu veic pati metode. Tāpēc, lai izvairītos no papildu apstrādes, mēs izmantojam objektu klonēšanu.