Java由淺入深通關(guān)抽象類與接口下
本篇介紹在對(duì)對(duì)象進(jìn)行比較和克隆操作的時(shí)候會(huì)使用的接口,然后介紹一個(gè)類:Object
在Java中Object類默認(rèn)是所有類的父類,里面有一些常用的方法會(huì)介紹
1.對(duì)象的比較
兩個(gè)對(duì)象要進(jìn)行比較之前,我們首先需要確定依據(jù)什么來進(jìn)行比較,對(duì)象中的成員變量那么多,直接比較是無法比較的
1.1 Comparable<T>
<T>是接口的參數(shù),里面填要比較的對(duì)象的類型
此接口里面只有一個(gè)compareTo抽象方法,結(jié)構(gòu)如下:
在類中實(shí)現(xiàn)此接口后就可以進(jìn)行類和類之間的大小的比較
1.2 Comparator<T>
這個(gè)接口中有一個(gè)抽象方法compare,同樣是用來實(shí)現(xiàn)對(duì)象之間比較大小,方法的結(jié)構(gòu)如下:
和Comparable<T>接口所不同的是,Comparator<T>接口可以作為Arrays類中sort方法的參數(shù)
如果是元素為類的數(shù)組,使用Comparator<T>接口可以進(jìn)一步進(jìn)行數(shù)組排序
2.克隆對(duì)象
2.1 Cloneable
這個(gè)接口是一個(gè)空接口,但類需要實(shí)現(xiàn)此接口才能被克隆,而要重寫的方法則是Object類中的clone()方法
在IDEA中自動(dòng)重寫的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 + '}'; } }
我們?cè)趍ain方法中將其實(shí)例化后克隆給另一個(gè)對(duì)象,看看結(jié)果:
此時(shí)a并沒有因?yàn)閎的改變而改變,clone()為深拷貝
我們?cè)賹㈩怉進(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)容再克隆一份,所以我們需要對(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 + '}'; } }
至于為什么自己畫圖試試 ,這里就不講了
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í)需要對(duì)其進(jìn)行重寫,這也是上面的例子中有toString方法的原因
本篇結(jié)束,完
到此這篇關(guān)于Java由淺入深通關(guān)抽象類與接口下的文章就介紹到這了,更多相關(guān)Java抽象類與接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java調(diào)用chatgpt接口來實(shí)現(xiàn)專屬于自己的人工智能助手
這篇文章主要介紹了用java來調(diào)用chatget的接口,實(shí)現(xiàn)自己的聊天機(jī)器人,對(duì)人工智能感興趣的小伙伴可以參考閱讀2023-03-03網(wǎng)易Java程序員兩輪面試 請(qǐng)問你能答對(duì)幾個(gè)?
為大家分享網(wǎng)易Java程序員兩輪面試題,考考大家,這些問題你能答對(duì)幾個(gè)?2017-11-11