Κοινή χρήση τεχνολογίας

Εξηγήστε τη διαφορά μεταξύ αντιγραφής σε βάθος και ρηχού αντιγράφου στην Java. Τι είναι οι ανώνυμες εσωτερικές τάξεις στην Java; Ποια είναι τα σενάρια εφαρμογής του;

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Εξηγήστε τη διαφορά μεταξύ του βαθιού αντιγράφου και του ρηχού αντιγράφου στην Java.

Στην Java, το Deep Copy και το Shallow Copy είναι δύο τρόποι αντιγραφής αντικειμένων Οι συμπεριφορές τους κατά την αντιγραφή αντικειμένων είναι ουσιαστικά διαφορετικές.

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

Το ρηχό αντίγραφο αναφέρεται στη δημιουργία ενός νέου αντικειμένου και στη συνέχεια στην αντιγραφή των μη στατικών πεδίων του τρέχοντος αντικειμένου στο νέο αντικείμενο, τότε το πεδίο αντιγράφεται λίγο προς bit. η αναφορά αντιγράφεται αλλά όχι Το αντικείμενο αναφοράς δεν αντιγράφεται. Επομένως, το αρχικό αντικείμενο και το αντίγραφό του αναφέρονται στο ίδιο αντικείμενο.

Στην Java, αυτό μπορεί να επιτευχθεί μεCloneableΔιασύνδεση και επανεγγραφήclone()Μέθοδος υλοποίησης ρηχού αντιγράφου.Objectστην τάξηclone()Αυτή η μέθοδος μπορεί να επιτύχει ρηχή αντιγραφή.

class Original implements Cloneable {
private int[] nums;
public Original() {
nums = new int[5];
}
public void setNums(int[] nums) {
this.nums = nums;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}

Σε αυτό το παράδειγμα,nums Είναι τύπος αναφοράς.ανOriginalΤο αντικείμενο αντιγράφεται ρηχά, τότε τοnumsκαι στο αρχικό αντικείμενοnumsθα δείχνει στο ίδιο αντικείμενο πίνακα.

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

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

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

class DeepCopied implements Cloneable {
private int[] nums;
public DeepCopied() {
nums = new int[5];
}
public void setNums(int[] nums) {
this.nums = nums;
}
@Override
public Object clone() throws CloneNotSupportedException {
DeepCopied copied = (DeepCopied) super.clone();
copied.nums = nums.clone(); // 对引用类型的成员变量也进行拷贝
return copied;
}
}

Σε αυτό το παράδειγμα,numsΟ πίνακας αντιγράφεται επίσης, επομένως το αρχικό αντικείμενο και το αντίγραφο δεν κοινοποιούνταιnumsπίνακας.

Συνοψίζω

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

Η επιλογή χρήσης αντιγραφής σε βάθος ή ρηχού αντιγράφου εξαρτάται από τα συγκεκριμένα σενάρια και τις απαιτήσεις της εφαρμογής.


Τι είναι οι ανώνυμες εσωτερικές τάξεις στην Java; Ποια είναι τα σενάρια εφαρμογής του;