亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java Clone接口和深拷貝詳解

 更新時(shí)間:2021年08月24日 10:57:39   作者:eaglewgs  
今天小編就為大家分享一篇關(guān)于Java Clonable接口和深拷貝詳解上的深入了解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧

對(duì)于數(shù)組的拷貝,如果是簡(jiǎn)單類(lèi)型的話(huà)是深拷貝,如果是引用類(lèi)型的話(huà)是淺拷貝,但是因?yàn)閖ava是面向?qū)ο蟮模诨卮鹈嬖嚬賳?wèn)題的時(shí)候,我們可以不用說(shuō)的這么細(xì),可以直接說(shuō)淺拷貝。

代碼示例1

class Person implements Cloneable{//如果想克隆自定義類(lèi),那么需要在自定義類(lèi)上實(shí)現(xiàn)Cloneable接口
    public int age;
    /*疑問(wèn):為什么這個(gè)接口是空接口呢?這是一個(gè)面試問(wèn)題。
    空節(jié)課:也把它叫做標(biāo)記接口。其實(shí)就是這個(gè)意思:只要一個(gè)類(lèi)實(shí)現(xiàn)了這個(gè)接口,那么就標(biāo)記這個(gè)類(lèi)是可以進(jìn)行clone的
    *
    * 2:重寫(xiě)clone方法*/
    @Override
    protected Object clone() throws CloneNotSupportedException {//重寫(xiě)了父類(lèi)的克隆方法
        return super.clone();
    }
}
public class TestDemo {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person1 = new Person();
        Person person2 = (Person) person1.clone();
        System.out.println(person1.age);
        System.out.println(person2.age);
        System.out.println("=======修改=======");
        person2.age = 99;
        System.out.println(person1.age);
        System.out.println(person2.age);
    }
    /*public static void main(String[] args) {
        int[] array = {1,2,3,4,5,6};
        int[] array2 = array.clone();//對(duì)這個(gè)數(shù)組進(jìn)行克隆
        array2[0] = 33;//改變拷貝后的數(shù)組元素的值不會(huì)影響原來(lái)數(shù)組的元素,這種情況是深拷貝
        System.out.println(Arrays.toString(array2));
        System.out.println(Arrays.toString(array));
    }*/
}

輸出為:

在這里插入圖片描述

因?yàn)楦淖兊氖呛?jiǎn)單類(lèi)型,所以這種情況是深拷貝。

代碼示例2

class Money{
    double money = 12.5;
}
class Person implements Cloneable{//如果想克隆自定義類(lèi),那么需要在自定義類(lèi)上實(shí)現(xiàn)Cloneable接口
    public int age;
    /*疑問(wèn):為什么這個(gè)接口是空接口呢?這是一個(gè)面試問(wèn)題。
    空節(jié)課:也把它叫做標(biāo)記接口。其實(shí)就是這個(gè)意思:只要一個(gè)類(lèi)實(shí)現(xiàn)了這個(gè)接口,那么就標(biāo)記這個(gè)類(lèi)是可以進(jìn)行clone的
    *
    * 2:重寫(xiě)clone方法*/
    Money m = new Money();
    @Override
    protected Object clone() throws CloneNotSupportedException {//重寫(xiě)了父類(lèi)的克隆方法
        return super.clone();
    }
}
public class TestDemo {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person1 = new Person();
        Person person2 = (Person) person1.clone();
        System.out.println(person1.m.money);
        System.out.println(person2.m.money);
        System.out.println("=========修改==========");
        person2.m.money = 99.9;
        System.out.println(person1.m.money);
        System.out.println(person2.m.money);
    }
}

輸出為:

在這里插入圖片描述

可以參考以下圖分析:

在這里插入圖片描述

這種情況就是淺拷貝,那么可以將這個(gè)淺拷貝變成深拷貝嗎?只需要將Money也克隆一下

class Money implements Cloneable{//如果想要變成深拷貝的話(huà),那么money也需要被克隆。
    double money = 12.5;
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
class Person implements Cloneable{//如果想克隆自定義類(lèi),那么需要在自定義類(lèi)上實(shí)現(xiàn)Cloneable接口
    public int age;
    Money m = new Money();
    @Override
    protected Object clone() throws CloneNotSupportedException {//重寫(xiě)了父類(lèi)的克隆方法
        Person p = (Person)super.clone();//1:將當(dāng)前的對(duì)象克隆一份,克隆person
        p.m = (Money) this.m.clone();//2:克隆當(dāng)前的Money對(duì)象
        return p;
    }
}
public class TestDemo {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person1 = new Person();
        Person person2 = (Person) person1.clone();
        System.out.println(person1.m.money);
        System.out.println(person2.m.money);
        System.out.println("=========修改==========");
        person2.m.money = 99.9;
        System.out.println(person1.m.money);
        System.out.println(person2.m.money);
    }
}

在這里插入圖片描述

這樣就就將淺拷貝轉(zhuǎn)變成了深拷貝,可以參考以下圖分析:

在這里插入圖片描述

總結(jié)

本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • mybatis快速入門(mén)學(xué)習(xí)教程新手注意問(wèn)題小結(jié)

    mybatis快速入門(mén)學(xué)習(xí)教程新手注意問(wèn)題小結(jié)

    MyBatis 是支持定制化 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射的優(yōu)秀的持久層框架。接下來(lái)通過(guò)本文給大家介紹mybatis快速入門(mén)學(xué)習(xí)教程新手注意問(wèn)題小結(jié),需要的朋友可以參考下
    2017-02-02
  • Netty簡(jiǎn)單的入門(mén)代碼示例

    Netty簡(jiǎn)單的入門(mén)代碼示例

    這篇文章主要介紹了Netty簡(jiǎn)單的入門(mén)代碼示例,Netty 的內(nèi)部實(shí)現(xiàn)是很復(fù)雜的,但是 Netty 提供了簡(jiǎn)單易用的API從網(wǎng)絡(luò)處理代碼中解耦業(yè)務(wù)邏輯,Netty 是完全基于 NIO 實(shí)現(xiàn)的,所以整個(gè) Netty 都是異步的,需要的朋友可以參考下
    2023-12-12
  • Java實(shí)現(xiàn)鼠標(biāo)拖拽移動(dòng)界面組件

    Java實(shí)現(xiàn)鼠標(biāo)拖拽移動(dòng)界面組件

    在Java中,F(xiàn)rame或者JFrame自身已經(jīng)實(shí)現(xiàn)了鼠標(biāo)拖拽標(biāo)題欄移動(dòng)窗口的功能。但是Jframe的樣式實(shí)在無(wú)法令人滿(mǎn)意,那你又該怎么實(shí)現(xiàn)鼠標(biāo)拖拽移動(dòng)窗口的目的呢?今天我們來(lái)探討下
    2014-09-09
  • java 裝飾模式(Decorator Pattern)詳解及實(shí)例代碼

    java 裝飾模式(Decorator Pattern)詳解及實(shí)例代碼

    裝飾器模式(Decorator Pattern)允許向一個(gè)現(xiàn)有的對(duì)象添加新的功能,同時(shí)又不改變其結(jié)構(gòu)。這種類(lèi)型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它是作為現(xiàn)有的類(lèi)的一個(gè)包裝
    2016-10-10
  • springcloud項(xiàng)目里application.yml不加載的坑及解決

    springcloud項(xiàng)目里application.yml不加載的坑及解決

    這篇文章主要介紹了springcloud項(xiàng)目里application.yml不加載的坑及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Java數(shù)據(jù)結(jié)構(gòu) 遞歸之迷宮回溯案例講解

    Java數(shù)據(jù)結(jié)構(gòu) 遞歸之迷宮回溯案例講解

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)遞歸之迷宮回溯案例講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java實(shí)現(xiàn)HttpGet請(qǐng)求傳body參數(shù)

    Java實(shí)現(xiàn)HttpGet請(qǐng)求傳body參數(shù)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)HttpGet請(qǐng)求傳body參數(shù)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • Spark網(wǎng)站日志過(guò)濾分析實(shí)例講解

    Spark網(wǎng)站日志過(guò)濾分析實(shí)例講解

    這篇文章主要介紹了Spark網(wǎng)站日志過(guò)濾分析實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-02-02
  • java 多線(xiàn)程饑餓現(xiàn)象的問(wèn)題解決方法

    java 多線(xiàn)程饑餓現(xiàn)象的問(wèn)題解決方法

    這篇文章主要介紹了java 多線(xiàn)程饑餓現(xiàn)象的問(wèn)題解決方法的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Java數(shù)據(jù)結(jié)構(gòu)與算法之循環(huán)隊(duì)列的實(shí)現(xiàn)

    Java數(shù)據(jù)結(jié)構(gòu)與算法之循環(huán)隊(duì)列的實(shí)現(xiàn)

    循環(huán)隊(duì)列 (Circular Queue) 是一種特殊的隊(duì)列。循環(huán)隊(duì)列解決了隊(duì)列出隊(duì)時(shí)需要將所有數(shù)據(jù)前移一位的問(wèn)題。本文將帶大家詳細(xì)了解循環(huán)隊(duì)列如何實(shí)現(xiàn),需要的朋友可以參考一下
    2021-12-12

最新評(píng)論