Teknologian jakaminen

Selitä ero syväkopion ja matalan kopion välillä Javassa. Mitä ovat anonyymit sisäiset luokat Javassa? Mitkä ovat sen sovellusskenaariot?

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

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 saavuttaaCloneableKäyttöliittymä ja uudelleenkirjoitusclone()Menetelmä matalan kopion toteuttamiseksi.Objectluokassaclone()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.josOriginalObjekti kopioidaan matalasti, sittennumsja alkuperäisessä esineessänumsosoittaa samaan taulukkoobjektiin.

Syvä kopio

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änumsMyös taulukko kopioidaan, joten alkuperäistä objektia ja kopiota ei jaetanumsjoukko.

Tee yhteenveto

  • Matala kopioItse objekti ja sen ei-staattiset kentät kopioidaan, mutta viitattuja objekteja ei kopioida.
  • syvä kopioEi vain itse objektia ja sen ei-staattisia kenttiä kopioida, vaan myös kaikki viitetyyppien jäsenmuuttujat kopioidaan rekursiivisesti.

Syväkopion tai matalan kopion käyttö riippuu sovelluskohtaisista skenaarioista ja vaatimuksista.


Mitä ovat anonyymit sisäiset luokat Javassa? Mitkä ovat sen sovellusskenaariot?