A sekély és a mély másolás megvalósítása a Java-ban



Ez a cikk részletes és átfogó ismereteket nyújt Önnek a sekély másolásról és a mély másolásról a Java példákkal.

A klónozás a replika vagy másolat létrehozásának folyamata objektum, klónozási módszer A Java.lang.Object egy objektum másolatának vagy másolatának létrehozására szolgál. A Cloneable interfészt megvalósító java objektumok alkalmasak a klónozási módszer használatára. Ebben a cikkben a Sekély és a Mély Másolást a következő sorrendben tárgyaljuk:

Java objektum másolatának létrehozása

A Java objektum másolatát vagy másolatát létrehozhatjuk





1. Objektum másolatának létrehozása egy másik memóriahelyen. Ezt Deep másolatnak hívják.

2. Új referencia létrehozása, amely ugyanarra a memóriahelyre mutat. Ezt sekély másolatnak is nevezik.



mik a csomagok a java-ban

Sekély másolat

A klón metódus alapértelmezett megvalósítása a forrásobjektum sekély másolatát hozza létre, ez azt jelenti, hogy új Object típusú példány jön létre, az összes mezőt átmásolja egy új példányba, és új „Object” típusú objektumot ad vissza. Ennek az objektumnak kifejezetten típusúnak kell lennie a forrásobjektum objektumtípusában.

Ennek az objektumnak a forrásobjektum összes mezőjének pontos másolata lesz, beleértve a primitív típust és az objektum hivatkozásokat. Ha a forrásobjektum hivatkozásokat tartalmaz más objektumokra a mezőben, akkor az új példányban csak hivatkozások lesznek ezekre az objektumokra, az objektumok másolata nem jön létre. Ez azt jelenti, hogy ha sekély másolatban változtatunk, a változások a forrásobjektumban is tükröződni fognak. Mindkét eset nem független.

Az Object osztályban a klónozási módszer a természetben védett, így nem minden osztály használhatja a clone () metódust. Meg kell valósítania a Cloneable felületet, és felül kell írnia a klónozási módszert. Ha a Cloneable interfész nincs megvalósítva, akkor a CloneNotSupportedException.super.clone () sekély másolatot ad vissza az Object osztály megvalósításának megfelelően.



Sekély másolás kódja

csomag com.test osztály Osztály {String empId String fokozat String megnevezés nyilvános részleg (String empId, String fokozat, String megnevezés) {this.empId = empId this.grade = fokozat this.designation = kijelölés}} osztály Munkavállaló megvalósítja Clonable {int id Karakterlánc neve Osztály osztály nyilvános alkalmazott (int azonosító, Karakter név, Osztály osztály) {this.id = id this.name = név this.dept = dept} // A klón () metódus alapértelmezett verziója. Egy tárgy sekély másolatát hozza létre. védett objektumklón () dobja a CloneNotSupportedException {return super.clone ()}} public class ShallowCopyInJava {public static void main (String [] argument) {Department dept1 = new Department ('1', 'A', 'AVP') Employee emp1 = new Employee (111, 'John', dept1) Employee emp2 = null try {// Az emp1 klónjának létrehozása és az emp2-hez rendelése emp2 = (Employee) emp1.clone ()} catch (CloneNotSupportedException e) {e. printStackTrace ()} // Az 'emp1' jelölésének kinyomtatása System.out.println (emp1.dept.designation) // Output: AVP // Az 'emp2' megnevezésének megváltoztatása emp2.dept.designation = 'Director' // Ezt a változást az eredeti „emp1” Employee System.out.println (emp1.dept.designation) // Output: Director}} tükrözi.

Kimenet:

Output-Shallow-Copy

típusú casting Java-ban példával

A fenti példában van egy Employee class emp1 osztály, amelynek három osztályváltozója van (int), neve (String) és osztály (Department).

Most klónoztuk az emp1-et az emp2-be egy sekély másolat létrehozása érdekében, ezt követően megváltoztattuk a megjelölést az emp2 objektum segítségével, és ellenőriztük, hogy ugyanazok a változások tükröződnek-e az emp1-ben is.


Mély másolat

Az objektum mély másolatának pontos példánya lesz a forrásobjektum összes mezőjéről, például egy sekély másolatról, de a sima másolattól eltérően, ha a forrásobjektum hivatkozik az objektumra mint mezőkre, akkor az objektum másolata a klón hívásával jön létre módszer. Ez azt jelenti, hogy mind a forrás, mind a cél objektumok függetlenek egymástól. A klónozott objektumban végrehajtott bármilyen változás nem befolyásolja a forrásobjektumot.

A mély másolás kódja

csomag com.test osztály A tanszék megvalósítja a Cloneable {String empId Karakterlánc String megnevezése public Department (String empId, String fokozat, String megnevezés) {this.empId = empId this.grade = grade this.designation = designation} // A klón alapértelmezett verziója () módszer. védett objektumklón () dobja a CloneNotSupportedException {return super.clone ()}} osztályt Alkalmazott megvalósítja Clonable {int id String név Osztály tanszék public Employee (int id, String név, Department dept) {this.id = id this.name = név this.dept = dept} // A clone () metódus felülírása az objektum mély másolatának létrehozásához. védett objektumklón () dobja a CloneNotSupportedException {Employee emp = (Employee) super.clone () emp.dept = (Department) dept.clone () return emp}} public class DeepCopyInJava {public static void main (String [] args) { Department dept1 = new Department ('1', 'A', 'AVP') Employee emp1 = new Employee (111, 'John', dept1) Employee emp2 = null try {// Az emp1 klónjának létrehozása és hozzárendelése az emp2-hez emp2 = (Employee) emp1.clone ()} catch (CloneNotSupportedException e) {e.printStackTrace ()} // Az 'emp1' jelölésének kinyomtatása System.out.println (emp1.dept.designation) // Kimenet: AVP / / Az 'emp2' megnevezésének megváltoztatása emp2.dept.designation = 'Director' // Ez a változás tükröződik az eredeti 'emp1' Employee System.out.println (emp1.dept.designation) // Output: AVP}}

Kimenet:

A mély másolás fenti példájában a sekély másolattal ellentétben mind a forrás, mind a cél objektumok függetlenek egymástól. Az emp2-ben végrehajtott bármilyen változás nem befolyásolja az emp1-t.

Különbség a sekély és a mély másolás között

Sekély másolat Mély másolat
A klónozott objektum és a forrásobjektum nincs teljesen elválasztvaA klónozott és a forrás objektumok teljesen függetlenek egymástól.
A klónozott példányban végrehajtott változtatások hatással lesznek a forrásobjektum referencia változójáraA klónozott példányban végrehajtott változtatások nem befolyásolják a forrásobjektum referencia változóját.
A klón alapértelmezett változata a sekély másolatA mély másolat létrehozásához felül kell írnunk az Object class klónozási módszerét.
A sekély másolás előnyös, ha az objektum osztályváltozói csak primitív típusúak, mint mezőkA mély másolat előnyös, ha az objektum osztályváltozói mezőként más objektumokra hivatkoznak.
Viszonylag gyorsViszonylag lassú.

Ezzel eljutottunk a Sekély másolás és a mély másolás cikk végéhez. Remélem, megértette a kettő közötti különbségeket.

különbség a végleges és a java-ban végleges között

Nézze meg a az Edureka, egy megbízható online tanulási vállalat, amelynek több mint 250 000 elégedett tanulóval rendelkező hálózata elterjedt az egész világon. Az Edureka Java J2EE és SOA képzési és tanúsítási tanfolyamát olyan hallgatók és szakemberek számára tervezték, akik Java fejlesztők szeretnének lenni.

Van egy kérdésünk? Kérjük, említse meg a „Sekély másolás és mély másolás” blog megjegyzés rovatában, és a lehető leghamarabb kapcsolatba lépünk Önnel.