Kloning er en prosess for å lage en kopi eller kopi av objekt, klonmetode Java.lang.Object brukes til å lage kopi eller replika av et objekt. java-objekter som implementerer Cloneable interface er kvalifisert for å bruke klonmetoden. I denne artikkelen vil vi diskutere Shallow Copy og Deep Copy i følgende rekkefølge:
- Opprette kopi av Java-objekt
- Hva er en grunne kopi?
- Hva er en dyp kopi?
- Forskjellen mellom lav kopi og dyp kopi
Opprette kopi av Java-objekt
Vi kan lage en kopi eller kopi av java-objektet ved
1. Lage en kopi av objektet på et annet minneplass. Dette kalles en dyp kopi.
2. Opprette en ny referanse som peker til samme minneplassering. Dette kalles også en grunne kopi.
Grunn kopi
Standardimplementeringen av klonmetoden skaper en grunne kopi av kildeobjektet, det betyr at en ny forekomst av typen Objekt blir opprettet, den kopierer alle feltene til en ny forekomst og returnerer et nytt objekt av typen 'Objekt'. Dette objektet må eksplisitt skrives inn i objekttypen for kildeobjektet.
Dette objektet vil ha en nøyaktig kopi av alle feltene til kildeobjektet, inkludert den primitive typen og objektreferanser. Hvis kildeobjektet inneholder noen referanser til andre objekter i feltet, vil den nye forekomsten bare ha referanser til disse objektene, og en kopi av disse objektene blir ikke opprettet. Dette betyr at hvis vi gjør endringer i grunne kopier, vil endringene gjenspeiles i kildeobjektet. Begge tilfeller er ikke uavhengige.
Klonmetoden i Objektklasse er beskyttet i naturen, så ikke alle klasser kan bruke klonemetoden (). Du må implementere Cloneable interface og overstyre klonmetoden. Hvis det klonable grensesnittet ikke er implementert, får du CloneNotSupportedException.super.clone () vil returnere grunne kopier i henhold til implementering i objektklasse.
forskjell mellom grensesnitt og klasse
Kode for grunne kopier
pakke com.test klasse Avdeling {String empId String grade String designation public Department (String empId, String grade, String designation) {this.empId = empId this.grade = grade this.designation = designation}} class Medarbeider implementerer Cloneable {int id Strengnavn Avdelingsavdeling offentlig Ansatt (int id, String navn, Avdeling avd.) {This.id = id this.name = name this.dept = avd.} // Standardversjon av clone () -metoden. Det skaper grunne kopier av et objekt. beskyttet objektklon () kaster CloneNotSupportedException {retur super.clone ()}} offentlig klasse ShallowCopyInJava {offentlig statisk ugyldig hoved (String [] args) {Avdeling dept1 = ny avdeling ('1', 'A', 'AVP') Ansatt emp1 = ny ansatt (111, 'John', avd. 1) Ansatt emp2 = null prøv {// Opprette en klon av emp1 og tildele den til emp2 emp2 = (ansatt) emp1.clone ()} fangst (CloneNotSupportedException e) {e. printStackTrace ()} // Utskrift av betegnelsen 'emp1' System.out.println (emp1.dept.designation) // Output: AVP // Endring av betegnelsen 'emp2' emp2.dept.designation = 'Director' // Denne endringen vil gjenspeiles i den opprinnelige ansattes 'emp1' System.out.println (emp1.dept.designation) // Output: Director}}
Produksjon:
bruk av pakker i java
I eksemplet ovenfor har vi en ansatt klasse emp1 som har tre klassevariabler id (int), navn (streng) og avdeling (avdeling).
Vi klonet nå emp1 til emp2 for å lage en grunne kopi, etter det endret vi betegnelsen ved hjelp av emp2-objektet og bekreftet at de samme endringene også gjenspeiles i emp1.
Dyp kopi
Den dype kopien av et objekt vil ha en eksakt kopi av alle feltene til kildeobjektet, som en grunne kopi, men i motsetning til sallow copy hvis kildeobjektet har noen referanse til objektet som felt, blir en kopi av objektet opprettet ved å ringe klon metode. Dette betyr at både kilde- og målobjekter er uavhengige av hverandre. Enhver endring som er gjort i det klonede objektet, vil ikke påvirke kilden.
Kode for dyp kopi
pakke com.test klasse Avdeling implementerer Cloneable {String empId String grade String designation public Department (String empId, String grade, String designation) {this.empId = empId this.grade = grade this.designation = designation} // Standardversjon av klon () metode. beskyttet objektklon () kaster CloneNotSupportedException {return super.clone ()}} klasse Ansatt implementerer Cloneable {int id Strengnavn Avdeling avd. offentlig ansatt (int id, Strengnavn, Avdeling avd.) {this.id = id this.name = name this.dept = dept} // Overriding clone () -metoden for å lage en dyp kopi av et objekt. beskyttet objekt klon () kaster CloneNotSupportedException {ansatt emp = (ansatt) super.clone () emp.dept = (avdeling) dept.clone () retur emp}} offentlig klasse DeepCopyInJava {offentlig statisk ugyldig hoved (String [] args) { Avdeling dept1 = ny avdeling ('1', 'A', 'AVP') Ansatt emp1 = ny ansatt (111, 'John', avd1) Ansatt emp2 = null prøve {// Opprette en klon av emp1 og tildele den til emp2 emp2 = (Ansatt) emp1.clone ()} fangst (CloneNotSupportedException e) {e.printStackTrace ()} // Utskrift av betegnelsen 'emp1' System.out.println (emp1.dept.designation) // Output: AVP / / Endring av betegnelsen 'emp2' emp2.dept.designation = 'Director' // Denne endringen vil gjenspeiles i den opprinnelige ansattes 'emp1' System.out.println (emp1.dept.designation) // Output: AVP}}
Produksjon:
I eksemplet ovenfor med Deep copy, i motsetning til grunne kopier, er både kilde- og destinasjonsobjekter uavhengige av hverandre. Enhver endring i emp2 vil ikke påvirke emp1.
Forskjellen mellom lav kopi og dyp kopi
Grunn kopi | Dyp kopi |
Klonet objekt og kildeobjekt henger ikke helt sammen | Klonede gjenstander og kildeobjekter er helt uavhengige av hverandre. |
Endringer som er gjort i den klonede forekomsten, vil påvirke referansevariabelen til kildeobjektet | Endringer som er gjort i den klonede forekomsten, vil ikke påvirke referansevariabelen til kildeobjektet. |
Standardversjonen av klonen er den grunne kopien | For å lage dyp kopi må vi overstyre klonmetoden til Object-klasse. |
Grunn kopi foretrekkes hvis klassevariabler for objektet bare er primitive som felt | En dyp kopi foretrekkes hvis objektets klassevariabler har referanser til andre objekter som felt. |
Det er relativt raskt | Det er relativt tregt. |
Med dette kommer vi til slutten av Shallow Copy og Deep Copy-artikkelen. Jeg håper du fikk forståelse for de forskjellige forskjellene mellom de to.
lage en rekke objekter
Sjekk ut av Edureka, et pålitelig online læringsfirma med et nettverk av mer enn 250 000 fornøyde elever spredt over hele verden. Edurekas Java J2EE- og SOA-opplæring og sertifiseringskurs er designet for studenter og fagpersoner som ønsker å være Java-utvikler.
Har du et spørsmål til oss? Vennligst nevn det i kommentarfeltet i denne 'Shallow Copy and Deep Copy' -bloggen, så kommer vi tilbake til deg så snart som mulig.