Πώς να εφαρμόσετε ρηχό αντίγραφο και βαθύ αντίγραφο σε Java



Αυτό το άρθρο θα σας παράσχει αναλυτικές και περιεκτικές γνώσεις σχετικά με ρηχά αντίγραφα και βαθιά αντιγραφή στην Java με παραδείγματα.

Η κλωνοποίηση είναι μια διαδικασία δημιουργίας αντιγράφου ή αντιγράφου του αντικείμενο, μέθοδος κλώνου Java.lang.Object χρησιμοποιείται για τη δημιουργία αντιγράφου ή αντιγράφου ενός αντικειμένου. Τα αντικείμενα java που εφαρμόζουν διεπαφή Cloneable είναι κατάλληλα για χρήση της μεθόδου κλώνου. Σε αυτό το άρθρο, θα συζητήσουμε το ρηχό αντίγραφο και το βαθύ αντίγραφο με την ακόλουθη σειρά:

Δημιουργία αντιγράφου αντικειμένου Java

Μπορούμε να δημιουργήσουμε ένα αντίγραφο ή αντίγραφο αντικειμένου java από





1. Δημιουργία αντιγράφου αντικειμένου σε διαφορετική θέση μνήμης. Αυτό ονομάζεται αντίγραφο σε βάθος.

τι είναι σειριοποιήσιμο στην Java

2. Δημιουργία μιας νέας αναφοράς που δείχνει την ίδια θέση μνήμης. Αυτό ονομάζεται επίσης ρηχό αντίγραφο.



Ρηχό αντίγραφο

Η προεπιλεγμένη εφαρμογή της μεθόδου κλώνου δημιουργεί ένα ρηχό αντίγραφο του αντικειμένου προέλευσης, σημαίνει ότι δημιουργείται μια νέα παρουσία τύπου Αντικείμενο, αντιγράφει όλα τα πεδία σε μια νέα παρουσία και επιστρέφει ένα νέο αντικείμενο τύπου «Αντικείμενο». Αυτό το αντικείμενο πρέπει ρητά να είναι τυπογραφικό σε τύπο αντικειμένου αντικειμένου προέλευσης.

Αυτό το αντικείμενο θα έχει ένα ακριβές αντίγραφο όλων των πεδίων του αντικειμένου προέλευσης, συμπεριλαμβανομένου του πρωτόγονου τύπου και των αναφορών αντικειμένων. Εάν το αντικείμενο προέλευσης περιέχει οποιεσδήποτε αναφορές σε άλλα αντικείμενα στο πεδίο, τότε στη νέα παρουσία θα υπάρχουν μόνο αναφορές σε αυτά τα αντικείμενα, δεν δημιουργείται αντίγραφο αυτών των αντικειμένων. Αυτό σημαίνει ότι αν κάνουμε αλλαγές σε ρηχό αντίγραφο, οι αλλαγές θα αντικατοπτρίζονται στο αντικείμενο προέλευσης. Και οι δύο περιπτώσεις δεν είναι ανεξάρτητες.

Η μέθοδος κλώνου στην κατηγορία αντικειμένων προστατεύεται από τη φύση, επομένως δεν μπορούν όλες οι κλάσεις να χρησιμοποιήσουν τη μέθοδο κλώνου (). Πρέπει να εφαρμόσετε το Cloneable interface και να παρακάμψετε τη μέθοδο clone. Εάν η διεπαφή Cloneable δεν έχει εφαρμοστεί, τότε θα λάβετε το CloneNotSupportedException.super.clone () θα επιστρέψει ρηχό αντίγραφο σύμφωνα με την εφαρμογή στην κλάση Object.



Κωδικός για ρηχό αντίγραφο

package com.test class Department {String empId String grade String χαρακτηρισμός δημόσιο Τμήμα (String empId, String grade, String designation) {this.empId = empId this.grade = grade this.designation = designation}} class Υπάλληλος υλοποιεί Cloneable {int id Όνομα συμβολοσειράς Τμήμα δημόσιου υπαλλήλου (int id, όνομα συμβολοσειράς, τμήμα τμήματος) {this.id = id this.name = name this.dept = dept} // Προεπιλεγμένη έκδοση της μεθόδου κλώνου (). Δημιουργεί ρηχό αντίγραφο ενός αντικειμένου. προστατευμένο αντικείμενο clone () ρίχνει CloneNotSupportedException {return super.clone ()}} δημόσια τάξη ShallowCopyInJava {public static void main (String [] args) {Department dept1 = new Department ('1', 'A', 'AVP') Υπάλληλος emp1 = new Employee (111, 'John', dept1) Employee emp2 = null try {// Δημιουργία κλώνου του emp1 και εκχώρηση του στο emp2 emp2 = (Employee) emp1.clone ()} catch (CloneNotSupportedException e) {e. printStackTrace ()} // Εκτύπωση της ονομασίας 'emp1' System.out.println (emp1.dept.designation) // Έξοδος: AVP // Αλλαγή της ονομασίας 'emp2' emp2.dept.designation = 'Director' // Αυτή η αλλαγή θα αντικατοπτρίζεται στο αρχικό Employee 'emp1' System.out.println (emp1.dept.designation) // Έξοδος: Director}}

Παραγωγή:

Output-Shallow-Copy

Στο παραπάνω παράδειγμα, έχουμε μια κατηγορία εργαζομένων emp1 η οποία έχει τρεις μεταβλητές τάξης id (int), name (String) και department (Department).

Κλωνοποιήσαμε τώρα το emp1 σε emp2 για να δημιουργήσουμε ένα ρηχό αντίγραφο, μετά από αυτό αλλάξαμε την ονομασία χρησιμοποιώντας το αντικείμενο emp2 και επαληθεύσαμε ότι οι ίδιες αλλαγές αντικατοπτρίστηκαν και στο emp1.


Βαθύ αντίγραφο

Το βαθύ αντίγραφο ενός αντικειμένου θα έχει ένα ακριβές αντίγραφο όλων των πεδίων του αντικειμένου προέλευσης όπως ένα ρηχό αντίγραφο, αλλά σε αντίθεση με το ρηχό αντίγραφο εάν το αντικείμενο προέλευσης έχει οποιαδήποτε αναφορά σε αντικείμενο ως πεδία, τότε δημιουργείται ένα αντίγραφο του αντικειμένου με την κλήση του κλώνου μέθοδος. Αυτό σημαίνει ότι και τα αντικείμενα προέλευσης και προορισμού είναι ανεξάρτητα το ένα από το άλλο. Οποιαδήποτε αλλαγή στο κλωνοποιημένο αντικείμενο δεν θα επηρεάσει το αντικείμενο προέλευσης.

Κωδικός για αντιγραφή σε βάθος

package com.test class Department υλοποιεί το Cloneable {String empId String grade String designing public Department (String empId, String grade, String designation) {this.empId = empId this.grade = grade this.designation = designation} // Προεπιλεγμένη έκδοση του κλώνου () μέθοδος. το προστατευμένο αντικείμενο clone () ρίχνει CloneNotSupportedException {return super.clone ()}} κλάση Εργαζόμενος υλοποιεί Κλωνοποιήσιμο {int id Όνομα συμβολοσειράς Τμήμα δημόσιου υπαλλήλου (int id, όνομα συμβολοσειράς, τμήμα τμήματος) {this.id = id this.name = name this.dept = dept} // Παράκαμψη κλώνου () μέθοδος για τη δημιουργία ενός αντιγράφου σε βάθος ενός αντικειμένου. προστατευμένο αντικείμενο clone () ρίχνει CloneNotSupportedException {Employee emp = (Employee) super.clone () emp.dept = (Department) dept.clone () return emp}} δημόσια τάξη 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 {// Δημιουργία κλώνου του emp1 και εκχώρηση του στο emp2 emp2 = (Υπάλληλος) emp1.clone ()} catch (CloneNotSupportedException e) {e.printStackTrace ()} // Εκτύπωση της ονομασίας 'emp1' System.out.println (emp1.dept.designation) // Έξοδος: AVP / / Αλλαγή του χαρακτηρισμού «emp2» emp2.dept.designation = «Διευθυντής» // Αυτή η αλλαγή θα αντικατοπτρίζεται στο αρχικό Υπάλληλος «emp1» System.out.println (emp1.dept.designation) // Έξοδος: AVP}}

Παραγωγή:

Στο παραπάνω παράδειγμα Deep copy, σε αντίθεση με το ρηχό αντίγραφο, τα αντικείμενα προέλευσης και προορισμού είναι ανεξάρτητα το ένα από το άλλο. Τυχόν αλλαγή που πραγματοποιείται στο emp2 δεν θα επηρεάσει το emp1.

Διαφορά μεταξύ ρηχού αντιγράφου και βαθιάς αντιγραφής

Ρηχό αντίγραφο Βαθύ αντίγραφο
Το κλωνοποιημένο αντικείμενο και το αντικείμενο προέλευσης δεν διαχωρίζονται πλήρωςΤα κλωνοποιημένα αντικείμενα και τα αντικείμενα προέλευσης είναι εντελώς ανεξάρτητα το ένα από το άλλο.
Οι αλλαγές που έγιναν στην κλωνοποιημένη παρουσία θα επηρεάσουν τη μεταβλητή αναφοράς του αντικειμένου προέλευσηςΟι αλλαγές που έγιναν στην κλωνοποιημένη παρουσία δεν θα επηρεάσουν τη μεταβλητή αναφοράς του αντικειμένου προέλευσης.
Η προεπιλεγμένη έκδοση του κλώνου είναι το ρηχό αντίγραφοΓια τη δημιουργία αντιγράφου σε βάθος πρέπει να παρακάμψουμε τη μέθοδο κλώνου της κλάσης αντικειμένων.
Το ρηχό αντίγραφο προτιμάται εάν οι μεταβλητές κλάσης του αντικειμένου είναι μόνο πρωτόγονοι τύποι ως πεδίαΈνα βαθύ αντίγραφο προτιμάται εάν οι μεταβλητές κλάσης του αντικειμένου έχουν αναφορές σε άλλα αντικείμενα ως πεδία.
Είναι σχετικά γρήγοροΕίναι σχετικά αργό.

Με αυτό, φτάνουμε στο τέλος του άρθρου Ρηχό αντίγραφο και αντιγραφή βάθους. Ελπίζω να έχετε κατανοήσει τις διάφορες διαφορές μεταξύ των δύο.

Δείτε το από την Edureka, μια αξιόπιστη διαδικτυακή εταιρεία εκμάθησης με δίκτυο περισσότερων από 250.000 ικανοποιημένων μαθητών σε όλο τον κόσμο. Το μάθημα εκπαίδευσης και πιστοποίησης Java J2EE και SOA της Edureka έχει σχεδιαστεί για φοιτητές και επαγγελματίες που θέλουν να γίνουν προγραμματιστές Java.

Έχετε μια ερώτηση για εμάς; Παρακαλώ αναφέρετέ το στην ενότητα σχολίων αυτού του ιστολογίου 'Ρηχό αντίγραφο και αντιγραφή σε βάθος' και θα επικοινωνήσουμε μαζί σας το συντομότερο δυνατό.