2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Selitä ero syväkopion ja matalan kopion välillä Javassa.
Javassa Deep Copy ja Shallow Copy ovat kaksi tapaa kopioida objekteja. Niiden käyttäytyminen objekteja kopioitaessa on olennaisesti erilainen.
Matala kopio viittaa uuden objektin luomiseen ja sen jälkeen nykyisen objektin ei-staattisten kenttien kopioimiseen uuteen objektiin. viittaus kopioidaan, mutta ei Viitattua objektia ei kopioida. Siksi alkuperäinen objekti ja sen kopio viittaavat samaan objektiin.
Javassa tämä voidaan saavuttaaCloneable
Käyttöliittymä ja uudelleenkirjoitusclone()
Menetelmä matalan kopion toteuttamiseksi.Object
luokassaclone()
Tällä menetelmällä voidaan saada matala kopio.
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(); | |
} | |
} |
Tässä esimerkissänums
On referenssityyppi.josOriginal
Objekti kopioidaan matalasti, sittennums
ja alkuperäisessä esineessänums
osoittaa samaan taulukkoobjektiin.
Syväkopio ei ainoastaan kopioi itse objektia, vaan myös kopioi rekursiivisesti kaikki objektin sisältämät viitetyypin jäsenmuuttujat, mikä tarkoittaa, että kopio ja alkuperäinen objekti eivät jaa viitetyypin jäsenmuuttujia. Yhden objektin jäsenmuuttujien muokkaaminen ei vaikuta toiseen objektiin.
Javassa syväkopioiden toteuttaminen vaatii usein koodin manuaalista kirjoittamista sen varmistamiseksi, että kaikki viitetyyppien jäsenmuuttujat kopioidaan asianmukaisesti.
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; | |
} | |
} |
Tässä esimerkissänums
Myös taulukko kopioidaan, joten alkuperäistä objektia ja kopiota ei jaetanums
joukko.
Syväkopion tai matalan kopion käyttö riippuu sovelluskohtaisista skenaarioista ja vaatimuksista.
Mitä ovat anonyymit sisäiset luokat Javassa? Mitkä ovat sen sovellusskenaariot?