最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java由淺入深通關(guān)抽象類與接口下

 更新時(shí)間:2022年04月26日 15:03:41   作者:星鴉wyk  
在類中沒有包含足夠的信息來描繪一個(gè)具體的對象,這樣的類稱為抽象類,接口是Java中最重要的概念之一,它可以被理解為一種特殊的類,不同的是接口的成員沒有執(zhí)行體,是由全局常量和公共的抽象方法所組成,本文給大家介紹Java抽象類和接口,感興趣的朋友一起看看吧

本篇介紹在對對象進(jìn)行比較和克隆操作的時(shí)候會使用的接口,然后介紹一個(gè)類:Object

在Java中Object類默認(rèn)是所有類的父類,里面有一些常用的方法會介紹

1.對象的比較

兩個(gè)對象要進(jìn)行比較之前,我們首先需要確定依據(jù)什么來進(jìn)行比較,對象中的成員變量那么多,直接比較是無法比較的

1.1 Comparable<T>

<T>是接口的參數(shù),里面填要比較的對象的類型

此接口里面只有一個(gè)compareTo抽象方法,結(jié)構(gòu)如下:

在類中實(shí)現(xiàn)此接口后就可以進(jìn)行類和類之間的大小的比較

1.2 Comparator<T>

這個(gè)接口中有一個(gè)抽象方法compare,同樣是用來實(shí)現(xiàn)對象之間比較大小,方法的結(jié)構(gòu)如下:

和Comparable<T>接口所不同的是,Comparator<T>接口可以作為Arrays類中sort方法的參數(shù)

如果是元素為類的數(shù)組,使用Comparator<T>接口可以進(jìn)一步進(jìn)行數(shù)組排序

2.克隆對象

2.1 Cloneable

這個(gè)接口是一個(gè)空接口,但類需要實(shí)現(xiàn)此接口才能被克隆,而要重寫的方法則是Object類中的clone()方法

在IDEA中自動重寫的clone()方法如下:

throws以及后面的語句不是現(xiàn)在的重點(diǎn),暫時(shí)略過

因?yàn)榇朔椒ǖ姆祷刂凳荗bject類,所以在使用的時(shí)候記得結(jié)果強(qiáng)制類型轉(zhuǎn)換成子類 

2.2 深拷貝和淺拷貝

既然說到克隆,那就不得不提深拷貝和淺拷貝,簡單說下二者的概念:

假設(shè)將A的內(nèi)容拷貝到B中,然后我們修改B中的內(nèi)容,如果A的內(nèi)容沒有改變,那么就是深拷貝,否則就是淺拷貝

需要說明的是:一個(gè)克隆方法是深拷貝還是淺拷貝和類里面的成員變量以及自己寫的代碼都有關(guān)系,兩個(gè)不同的類使用同一個(gè)克隆方法,一個(gè)是深拷貝,另一個(gè)是淺拷貝,這種情況是存在的

現(xiàn)在有一個(gè)類如下:

class A implements Cloneable{
    int i;
    int j;
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
    @Override
    public String toString() {
        return "{" +
                "i=" + i +
                ", j=" + j +
                '}';
    }
}

我們在main方法中將其實(shí)例化后克隆給另一個(gè)對象,看看結(jié)果:

此時(shí)a并沒有因?yàn)閎的改變而改變,clone()為深拷貝

我們再將類A進(jìn)行改造:

class B implements Cloneable {
    int k;
}
class A implements Cloneable{
    int i;
    int j;
    B c=new B();
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
    @Override
    public String toString() {
        return "{" +
                "i=" + i +
                ", j=" + j +
                ", c.k=" + c.k +
                '}';
    }
}

 結(jié)果如下:

那么此時(shí)clone是深拷貝還是淺拷貝?

出現(xiàn)這種結(jié)果的原因要從內(nèi)存上看,在類A沒有進(jìn)行修改之前內(nèi)存如下:

 類A修改后的內(nèi)存如下:

按照上圖來看,要實(shí)現(xiàn)深拷貝就需要把類B的內(nèi)容再克隆一份,所以我們需要對clone方法進(jìn)行修改

class B implements Cloneable {
    int k;
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
class A implements Cloneable{
    int i;
    int j;
    B c=new B();
    @Override
    protected Object clone() throws CloneNotSupportedException {
        A tmp=(A)super.clone(); 
        tmp.c=(B)this.c.clone();
        return tmp;
    }
    @Override
    public String toString() {
        return "{" +
                "i=" + i +
                ", j=" + j +
                ", c.k=" + c.k +
                '}';
    }
}

至于為什么自己畫圖試試 ,這里就不講了

3.Object類

Object類中有一些常用的方法這里拿出來介紹

3.1 equals

在Object類中此方法是用來比較大小的,返回值是布爾值,底層的實(shí)現(xiàn)邏輯如下:

public boolean equals(Object obj) {
    return (this == obj); 
}

關(guān)于“==”,如果兩邊的變量是基本類型的變量,比較的是值是否相同,而如果是引用類型的變量的話,比較的則是地址是否相同

3.2 toString

輸出語句System.out.println()底層調(diào)用的就是toString方法,不過如果輸出的是引用類型數(shù)據(jù)默認(rèn)是輸出修改后的地址,所以此時(shí)需要對其進(jìn)行重寫,這也是上面的例子中有toString方法的原因

本篇結(jié)束,完

到此這篇關(guān)于Java由淺入深通關(guān)抽象類與接口下的文章就介紹到這了,更多相關(guān)Java抽象類與接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java基于RMI遠(yuǎn)程過程調(diào)用詳解

    java基于RMI遠(yuǎn)程過程調(diào)用詳解

    這篇文章主要為大家詳細(xì)介紹了java基于RMI遠(yuǎn)程過程調(diào)用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 深入理解Java設(shè)計(jì)模式之橋接模式

    深入理解Java設(shè)計(jì)模式之橋接模式

    這篇文章主要介紹了JAVA設(shè)計(jì)模式之橋接模式的的相關(guān)資料,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2021-11-11
  • springboot配置http跳轉(zhuǎn)https的過程

    springboot配置http跳轉(zhuǎn)https的過程

    SSL是為網(wǎng)絡(luò)通信提供安全以及保證數(shù)據(jù)完整性的的一種安全協(xié)議,SSL在網(wǎng)絡(luò)傳輸層對網(wǎng)絡(luò)連接進(jìn)行加密,這篇文章主要介紹了springboot配置http跳轉(zhuǎn)https的過程,需要的朋友可以參考下
    2023-04-04
  • IDEA報(bào)錯(cuò):java:無效的源發(fā)行版21解決方式

    IDEA報(bào)錯(cuò):java:無效的源發(fā)行版21解決方式

    這篇文章主要給大家介紹了關(guān)于IDEA報(bào)錯(cuò):java:無效的源發(fā)行版21的解決方式,這個(gè)錯(cuò)誤是因?yàn)槟愕捻?xiàng)目使用的Java版本與你的IDEA使用的Java版本不一致導(dǎo)致的,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • 在IntelliJ IDEA中多線程并發(fā)代碼的調(diào)試方法詳解

    在IntelliJ IDEA中多線程并發(fā)代碼的調(diào)試方法詳解

    這篇文章主要介紹了在IntelliJ IDEA中多線程并發(fā)代碼的調(diào)試方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • MyBatis Mapper XML中比較操作符轉(zhuǎn)義問題解決

    MyBatis Mapper XML中比較操作符轉(zhuǎn)義問題解決

    在使用MyBatis編寫Mapper XML時(shí),有時(shí)會遇到比較操作符需要進(jìn)行轉(zhuǎn)義的情況,本文主要介紹了MyBatis Mapper XML中比較操作符轉(zhuǎn)義問題解決,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • 一篇文章帶你玩轉(zhuǎn)Spring bean的終極利器

    一篇文章帶你玩轉(zhuǎn)Spring bean的終極利器

    這篇文章主要給大家介紹了關(guān)于玩轉(zhuǎn)Spring bean的終極利器的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用spring bean具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • 舉例說明Java設(shè)計(jì)模式編程中ISP接口隔離原則的使用

    舉例說明Java設(shè)計(jì)模式編程中ISP接口隔離原則的使用

    這篇文章主要介紹了Java設(shè)計(jì)模式編程中ISP接口隔離原則的使用,接口隔離原則主張一個(gè)類對另外一個(gè)類的依賴性應(yīng)當(dāng)是建立在最小的接口上,需要的朋友可以參考下
    2016-02-02
  • Java設(shè)計(jì)模式之備忘錄模式使用詳解

    Java設(shè)計(jì)模式之備忘錄模式使用詳解

    這篇文章主要介紹了Java設(shè)計(jì)模式中備忘錄模式的使用,備忘錄設(shè)計(jì)模式也叫作快照模式,主要用于實(shí)現(xiàn)防丟失、撤銷、恢復(fù)等功能,本文將通過示例為大家講解備忘錄模式的定義與使用,需要的同學(xué)可以參考一下
    2024-02-02
  • Javaweb項(xiàng)目啟動Tomcat常見的報(bào)錯(cuò)解決方案

    Javaweb項(xiàng)目啟動Tomcat常見的報(bào)錯(cuò)解決方案

    Java Web項(xiàng)目啟動Tomcat時(shí)可能會遇到各種錯(cuò)誤,本文就來介紹一下Javaweb項(xiàng)目啟動Tomcat常見的報(bào)錯(cuò)解決方案,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02

最新評論

简阳市| 台北县| 新营市| 汉沽区| 章丘市| 武冈市| 英德市| 北川| 依安县| 台江县| 阜新市| 五台县| 阜新市| 波密县| 龙川县| 醴陵市| 西峡县| 武汉市| 获嘉县| 郓城县| 金塔县| 全椒县| 潼南县| 河津市| 兴义市| 固镇县| 石景山区| 丹巴县| 泾川县| 化隆| 上饶县| 华蓥市| 木里| 皋兰县| 方山县| 清流县| 都昌县| 石城县| 嘉善县| 交城县| 灵川县|