欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

1.對(duì)象的比較

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

1.1 Comparable<T>

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

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

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

1.2 Comparator<T>

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

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

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

2.克隆對(duì)象

2.1 Cloneable

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

在IDEA中自動(dòng)重寫(xiě)的clone()方法如下:

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

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

2.2 深拷貝和淺拷貝

既然說(shuō)到克隆,那就不得不提深拷貝和淺拷貝,簡(jiǎn)單說(shuō)下二者的概念:

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

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

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

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 +
                '}';
    }
}

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

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

我們?cè)賹㈩?lèi)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)存上看,在類(lèi)A沒(méi)有進(jìn)行修改之前內(nèi)存如下:

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

按照上圖來(lái)看,要實(shí)現(xiàn)深拷貝就需要把類(lèi)B的內(nèi)容再克隆一份,所以我們需要對(duì)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 +
                '}';
    }
}

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

3.Object類(lèi)

Object類(lèi)中有一些常用的方法這里拿出來(lái)介紹

3.1 equals

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

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

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

3.2 toString

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

本篇結(jié)束,完

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

相關(guān)文章

  • java的IO流詳細(xì)解讀

    java的IO流詳細(xì)解讀

    這篇文章主要介紹了java的IO流詳細(xì)解讀,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • java調(diào)用chatgpt接口來(lái)實(shí)現(xiàn)專(zhuān)屬于自己的人工智能助手

    java調(diào)用chatgpt接口來(lái)實(shí)現(xiàn)專(zhuān)屬于自己的人工智能助手

    這篇文章主要介紹了用java來(lái)調(diào)用chatget的接口,實(shí)現(xiàn)自己的聊天機(jī)器人,對(duì)人工智能感興趣的小伙伴可以參考閱讀
    2023-03-03
  • MyBatis中TypeHandler的使用教程詳解

    MyBatis中TypeHandler的使用教程詳解

    在我們平常開(kāi)發(fā)操作數(shù)據(jù)庫(kù)時(shí),查詢(xún)、插入數(shù)據(jù)等操作行為,有時(shí)會(huì)報(bào)數(shù)據(jù)類(lèi)型不匹配異常,就可以得知數(shù)據(jù)的類(lèi)型是不唯一的必然是多種不同的數(shù)據(jù)類(lèi)型,本文給大家介紹了MyBatis中TypeHandler的使用教程,需要的朋友可以參考下
    2024-12-12
  • Maven打包上云的實(shí)現(xiàn)步驟

    Maven打包上云的實(shí)現(xiàn)步驟

    本文主要介紹了Maven打包上云的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • java操作oracle數(shù)據(jù)庫(kù)示例

    java操作oracle數(shù)據(jù)庫(kù)示例

    這篇文章主要介紹了java操作oracle數(shù)據(jù)庫(kù)示例,需要的朋友可以參考下
    2014-04-04
  • Java中的共享鎖CountDownLatch及源碼解析

    Java中的共享鎖CountDownLatch及源碼解析

    這篇文章主要介紹了Java中的共享鎖CountDownLatch及源碼解析,CountDownLatch是一種同步輔助工具,允許一個(gè)或多個(gè)線程等待,直到在其它線程中執(zhí)行的一組操作完成;CountDownLatch使用指定的計(jì)數(shù)初始化,需要的朋友可以參考下
    2023-11-11
  • 打造一款代碼命名工具的詳細(xì)教程

    打造一款代碼命名工具的詳細(xì)教程

    這篇文章主要介紹了來(lái),我們一起打造一款代碼命名工具,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 網(wǎng)易Java程序員兩輪面試 請(qǐng)問(wèn)你能答對(duì)幾個(gè)?

    網(wǎng)易Java程序員兩輪面試 請(qǐng)問(wèn)你能答對(duì)幾個(gè)?

    為大家分享網(wǎng)易Java程序員兩輪面試題,考考大家,這些問(wèn)題你能答對(duì)幾個(gè)?
    2017-11-11
  • Spring Boot支持HTTPS步驟詳解

    Spring Boot支持HTTPS步驟詳解

    這篇文章主要介紹了Spring Boot支持HTTPS步驟詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • java中的異步加載new Thread()方式

    java中的異步加載new Thread()方式

    這篇文章主要介紹了java中的異步加載new Thread()方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08

最新評(píng)論