首頁 >Java >java教程 >Java抽象類別與介面怎麼定義使用

Java抽象類別與介面怎麼定義使用

WBOY
WBOY轉載
2023-05-05 19:43:051544瀏覽

1.物件的比較

兩個物件要進行比較之前,我們首先需要確定依據什麼來進行比較,物件中的成員變數那麼多,直接比較是無法比較的

1.1 Comparable

是介面的參數,裡面填入要比較的物件的型別

此介面裡面只有一個compareTo抽象方法,結構如下:

Java抽象類別與介面怎麼定義使用

在類別中實作此介面後就可以進行類別和類別之間的大小的比較

1.2 Comparator

這個介面中有一個抽象方法compare,同樣是用來實作物件之間比較大小,方法的結構如下:

Java抽象類別與介面怎麼定義使用

Java抽象類別與介面怎麼定義使用

#和Comparable< ;T>介面不同的是,Comparator介面可以作為Arrays類別中sort方法的參數

Java抽象類別與介面怎麼定義使用

如果是元素為類別的數組,使用Comparator

2.複製物件

2.1 Cloneable

這個介面是空接口,但類別需要實作此介面才能被克隆,而要重寫的方法則是Object類別中的clone()方法

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

Java抽象類別與介面怎麼定義使用

throws以及後面的語句不是現在的重點,暫時略過

因為此方法的回傳值是Object類,所以在使用的時候記得結果強制型別轉換成子類 

2.2 深拷貝和淺拷貝

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

假設將A的內容拷貝到B中,然後我們修改B中的內容,如果A的內容沒有改變,那麼就是深拷貝,否則就是淺拷貝

#需要說明的是:一個克隆方法是深拷貝還是淺拷貝和類裡面的成員變量以及自己寫的程式碼都有關係,兩個不同的類別使用同一個克隆方法,一個是深拷貝,另一個是淺拷貝,這種情況是存在的

現在有一個類別如下:

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 +
                &#39;}&#39;;
    }
}

我們在main方法中將其實例化後克隆給另一個對象,看看結果:

Java抽象類別與介面怎麼定義使用

此時a並沒有因為b的改變而改變,clone()為深拷貝

我們再將類別A進行改造:

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 +
                &#39;}&#39;;
    }
}

 結果如下:

Java抽象類別與介面怎麼定義使用

##那麼此時clone是深拷貝還是淺拷貝?

出現這種結果的原因要從記憶體上看,在類別A沒有進行修改之前記憶體如下:

Java抽象類別與介面怎麼定義使用

 類別A修改後的記憶體如下:

Java抽象類別與介面怎麼定義使用

按照上圖來看,要實現深拷貝就需要把類別B的內容再克隆一份,所以我們需要對clone方法進行修改

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 +
                &#39;}&#39;;
    }
}

Java抽象類別與介面怎麼定義使用

至於為什麼自己畫圖試試,這裡就不講了

#3.Object類別

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

3.1 equals

在Object類別中此方法是用來比較大小的,傳回值是布林值,底層的實作邏輯如下:

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

關於“ ==”,如果兩邊的變數是基本型別的變量,比較的是值是否相同,而如果是引用型別的變數的話,比較的則是位址是否相同

##3.2 toString

輸出語句System.out.println()底層呼叫的就是toString方法,不過如果輸出的是引用類型資料預設是輸出修改後的位址,所以此時需要對其進行重寫,這也是上面的範例中有toString方法的原因

以上是Java抽象類別與介面怎麼定義使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除