Java由淺入深通關(guān)抽象類與接口下
本篇介紹在對對象進(jìn)行比較和克隆操作的時(shí)候會(huì)使用的接口,然后介紹一個(gè)類:Object
在Java中Object類默認(rèn)是所有類的父類,里面有一些常用的方法會(huì)介紹
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中自動(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 +
'}';
}
}我們在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)文章
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解決方式
這篇文章主要給大家介紹了關(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)試方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
MyBatis Mapper XML中比較操作符轉(zhuǎn)義問題解決
在使用MyBatis編寫Mapper XML時(shí),有時(shí)會(huì)遇到比較操作符需要進(jìn)行轉(zhuǎn)義的情況,本文主要介紹了MyBatis Mapper XML中比較操作符轉(zhuǎn)義問題解決,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
一篇文章帶你玩轉(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接口隔離原則的使用,接口隔離原則主張一個(gè)類對另外一個(gè)類的依賴性應(yīng)當(dāng)是建立在最小的接口上,需要的朋友可以參考下2016-02-02
Javaweb項(xiàng)目啟動(dòng)Tomcat常見的報(bào)錯(cuò)解決方案
Java Web項(xiàng)目啟動(dòng)Tomcat時(shí)可能會(huì)遇到各種錯(cuò)誤,本文就來介紹一下Javaweb項(xiàng)目啟動(dòng)Tomcat常見的報(bào)錯(cuò)解決方案,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02

