logo

Clone() metode i Java

Objektkloning refererer til oprettelsen af ​​en nøjagtig kopi af et objekt. Den opretter en ny forekomst af klassen af ​​det aktuelle objekt og initialiserer alle dets felter med nøjagtigt indholdet af de tilsvarende felter i dette objekt.

Metoder til at udføre objektkloning i Java

Der er 3 metoder til at oprette objektkloning i Java, som er nævnt nedenfor:



  1. Brug af Assignment Operator til at oprette en kopi af referencevariablen
  2. Oprettelse af en kopi ved hjælp af clone() metoden
  3. Brug af clone()-metoden – Deep Copy

1. Brug af Assignment Operator til at oprette en kopi af referencevariabel

I Java er der ingen operator til at oprette en kopi af et objekt. I modsætning til C++, i Java, hvis vi bruger tildelingsoperatoren, vil den oprette en kopi af referencevariablen og ikke objektet. Dette kan forklares ved at tage et eksempel. Følgende program demonstrerer det samme.

Nedenfor er implementeringen af ​​ovenstående emne:

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

>

>

Produktion

10 20 100 20 100 20>

2. Oprettelse af en kopi ved hjælp af clone() metoden

Klassen, hvis objekts kopi skal laves, skal have en offentlig klonemetode i den eller i en af ​​dens overordnede klasser.

  • Hver klasse, der implementerer clone() bør kalde super.clone() for at få den klonede objektreference.
  • Klassen skal også implementere java.lang.Cloneable grænseflade, hvis objektklone vi vil oprette, ellers vil den kaste CloneNotSupportedException, når klonmetoden kaldes på den pågældende klasses objekt.

Syntaks:

protected Object clone() throws CloneNotSupportedException>

i) Brug af clone() metode -Shallow Copy

Bemærk – I nedenstående kodeeksempel opretter clone()-metoden et helt nyt objekt med en anden hashCode-værdi, hvilket betyder, at den er på en separat hukommelsesplacering. Men på grund af at testobjektet c er inde i Test2, har de primitive typer opnået dyb kopi, men dette testobjekt c er stadig delt mellem t1 og t2. For at overvinde det laver vi eksplicit en dyb kopi for objektvariabel c, som diskuteres senere.

hvordan man konverterer int til streng

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

>

>

Produktion

10 20 300 40 100 20 300 40>

I ovenstående eksempel returnerer t1.clone den overfladiske kopi af objektet t1. For at få en dyb kopi af objektet skal der foretages visse modifikationer i klonmetoden efter opnåelse af kopien.

ii) Brug af clone() metode – Deep Copy

  • Hvis vi ønsker at oprette en dyb kopi af objekt X og placere den i et nyt objekt Y, så oprettes en ny kopi af alle refererede objektfelter, og disse referencer placeres i objekt Y. Dette betyder enhver ændring i refererede objektfelter i objektet. X eller Y vil kun blive reflekteret i det objekt og ikke i det andet. I eksemplet nedenfor opretter vi en dyb kopi af objektet.
  • En dyb kopi kopierer alle felter og laver kopier af dynamisk allokeret hukommelse, som felterne peger på. En dyb kopi opstår, når et objekt kopieres sammen med de objekter, det refererer til.

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

>

>

Produktion

10 20 30 40 100 20 300 40>

I ovenstående eksempel kan vi se, at et nyt objekt til Test-klassen er blevet tildelt til at kopiere et objekt, der vil blive returneret til klonemetoden. På grund af dette vil t3 få en dyb kopi af objektet t1. Så eventuelle ændringer foretaget i 'c'-objektfelterne af t3, vil ikke blive afspejlet i t1.

Deep Copy vs Shallow Copy

Der er visse forskelle mellem at bruge clone() som en dyb kopi versus den som en overfladisk kopi som nævnt nedenfor:

  • Overfladisk kopi er metoden til at kopiere et objekt og følges som standard i kloning. I denne metode kopieres felterne af et gammelt objekt X til det nye objekt Y. Mens objekttypefeltet kopieres, kopieres referencen til Y, dvs. objekt Y vil pege på den samme placering som angivet af X. Hvis feltværdien er en primitiv type, den kopierer værdien af ​​den primitive type.
  • Derfor vil alle ændringer, der foretages i refererede objekter i objekt X eller Y, blive afspejlet i andre objekter.

Lave kopier er billige og enkle at lave. I ovenstående eksempel lavede vi en overfladisk kopi af det objekt.

Hvorfor bruge klonmetoden() eller Fordele ved klonmetoden

  • Hvis vi bruger tildelingsoperatoren til at tildele en objektreference til en anden referencevariabel, vil den pege på den samme adresseplacering af det gamle objekt, og der vil ikke blive oprettet en ny kopi af objektet. På grund af dette vil eventuelle ændringer i referencevariablen blive afspejlet i det oprindelige objekt.
  • Hvis vi bruger en kopikonstruktør, så skal vi kopiere alle data eksplicit, dvs. vi skal omtildele alle felterne i klassen i konstruktøren eksplicit. Men i klonmetoden udføres dette arbejde med at skabe en ny kopi af metoden selv. Så for at undgå ekstra behandling bruger vi objektkloning.