Java?JDK內(nèi)置常用接口和深淺拷貝
前言
在Java中,我們使用接口優(yōu)先原則,當(dāng)一個(gè)場(chǎng)景可以使用抽象類也可以使用接口定義時(shí),優(yōu)先考慮使用接口,因?yàn)榻涌诟`活,使用抽象類必須滿足is a 的繼承樹關(guān)系,而且是單繼承,接口相比于抽象類更加的靈活,本篇我們就一起看看JDK中的常用內(nèi)置接口。
一、comparable接口
java.lang.Comperable:
當(dāng)一個(gè)類實(shí)現(xiàn)了Comperable接口,就表示該類具備了可比較的能力!
此時(shí)定義了一個(gè)Person類型的數(shù)組:
由于Person這個(gè)類型是自定義的類型,對(duì)于編譯器來說,不像int類型一樣大小關(guān)系一目了然;
對(duì)于編譯器來說,到底哪個(gè)Person對(duì)象大,哪個(gè)Person對(duì)象小,編譯器就無從得知了,此時(shí)就要讓Person這個(gè)類型具備可比較的能力,也就是要讓JDK知道Person對(duì)象“誰大誰小”,就需要讓Person這個(gè)類實(shí)現(xiàn)Comperable接口,覆寫抽象方法compereTo。
此時(shí)覆寫的方法返回值是int,傳入的參數(shù)是任意類型,因?yàn)椴恢酪容^的是什么類型
int返回值 >0 =0 <0 表示當(dāng)前對(duì)象this > 傳入對(duì)象o 表示當(dāng)前對(duì)象this = 傳入對(duì)象o 表示當(dāng)前對(duì)象this < 傳入對(duì)象o
覆寫comperTo方法:
當(dāng)Person類實(shí)現(xiàn)了Comperable接口,覆寫了compereTo方法之后,就可以把Person 類的對(duì)象進(jìn)行大小排序了,可以按年齡大小進(jìn)行比較,也可以按照姓名大小比較
此時(shí)是默認(rèn)按照年齡的升序排序的,如果想要按照年齡的降序排序,該怎么辦?該如何調(diào)整compereTo方法呢?
此時(shí)只需要將返回值取反,讓傳入的年齡減去當(dāng)前對(duì)象的年齡,讓JDK誤認(rèn)為年齡越小的反而越“大”。
二、Cloneable接口
java.lang.Cloneable
首先了解一下什么是克隆,就是原對(duì)象和新產(chǎn)生對(duì)象是兩個(gè)獨(dú)立的對(duì)象,新產(chǎn)生的對(duì)象是通過原對(duì)象“拷貝”而來的,屬性值和原對(duì)象完全一致。
要想讓一個(gè)類具備可復(fù)制的能力,就讓該類實(shí)現(xiàn)Cloneable接口,覆寫clone方法
這里Animal實(shí)現(xiàn)了Cloneable接口,但是沒有覆寫任何方法,但是這里沒有報(bào)錯(cuò),這是因?yàn)镃loneable接口里本來什么都沒有,但是這并不是一個(gè)空接口
類似Cloneable接口,把這種接口稱之為“標(biāo)記”接口,這個(gè)接口本身內(nèi)部沒有任何抽象方法,只有打上這個(gè)“標(biāo)記”的子類才具備可克隆的能力
JVM在運(yùn)行時(shí)會(huì)檢查所有實(shí)現(xiàn)了Cloneable接口的子類,然后賦予其可以克隆的能力
就像現(xiàn)在的一碼通,根據(jù)一碼通的顏色,把不同的人劃分為不同的類,只有檢測(cè)為綠碼的人,才能通過。
animal1 是通過 animal 克隆來的,但是此時(shí)使用“ == ”比較他們兩個(gè)的地址返回的還是false,說明克隆是產(chǎn)生了新的對(duì)象,只是新對(duì)象和原來的對(duì)象的屬性值完全相同
此時(shí)在產(chǎn)生一個(gè)對(duì)象animal2
Animal animal2 = new Animal();
animal1和animal2的區(qū)別:
animal1是依賴于animal產(chǎn)生的;
animal2的產(chǎn)生和animal完全沒有任何關(guān)系。
調(diào)用clone方法產(chǎn)生的對(duì)象不會(huì)調(diào)用構(gòu)造方法:
在Java中產(chǎn)生對(duì)象一共有兩種方式:
- 1.最普遍的通過構(gòu)造方法產(chǎn)生對(duì)象,當(dāng)有new關(guān)鍵字,就在堆上開辟該類相應(yīng)屬性的空間,給屬性賦默認(rèn)值。
- 2.通過clone()產(chǎn)生對(duì)象,調(diào)用clone方法時(shí),JVM會(huì)開辟與原對(duì)象內(nèi)存大小完全相同的新空間,并將對(duì)象的屬性值從原對(duì)象中復(fù)制一份(不推薦,Java都不推薦使用這種方式產(chǎn)生對(duì)象)
三、深淺拷貝
1.淺拷貝
克隆對(duì)象和原對(duì)象的確是兩個(gè)獨(dú)立的對(duì)象,
但是b1和b2的對(duì)象內(nèi)部包含了其他的引用,克隆后的b2包含的其他引用并沒有產(chǎn)生新的對(duì)象,b1.a 和 b2.a指向相同的A對(duì)象。
2.深拷貝
深拷貝就是克隆對(duì)象內(nèi)部包含的其他引用,也產(chǎn)生了新的對(duì)象
b1.a 和 b2.a指向不同的A對(duì)象。
Java中深拷貝的實(shí)現(xiàn)方式:
- 1.遞歸的使用clone方法
- 2.序列化(json字符串)
到此這篇關(guān)于Java JDK內(nèi)置常用接口和深淺拷貝的文章就介紹到這了,更多相關(guān)Java JDK內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 詳解java接口(interface)在不同JDK版本中的變化
- Java16 JDK安裝并設(shè)置環(huán)境變量的方法步驟
- 教你用JDK編譯Java文件的方法
- 解決IDEA?JDK9沒有module-info.java的問題
- 關(guān)于java中多個(gè)JDK和切換版本介紹
- Java9版本新特性同一個(gè)Jar支持多JDK版本運(yùn)行
- java底層JDK?Logging日志模塊處理細(xì)節(jié)深入分析
- 2021最新Java?JDK1.8的安裝超詳細(xì)教程
- Tomcat?8.5?+mysql?5.7+jdk1.8開發(fā)JavaSE的金牌榜小項(xiàng)目
- Java中的OpenJDK使用原理
相關(guān)文章
Java?MethodHandles介紹與反射對(duì)比區(qū)別詳解
這篇文章主要為大家介紹了Java?MethodHandles介紹與反射對(duì)比區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11SpringBoot中application.properties與application.yml區(qū)別小結(jié)
本文主要介紹了SpringBoot中application.properties與application.yml區(qū)別小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-10-10SpringBoot整合Minio實(shí)現(xiàn)上傳文件的完整步驟記錄
MinIO是一個(gè)基于Apache License v2.0開源協(xié)議的對(duì)象存儲(chǔ)服務(wù),它兼容亞馬遜S3云存儲(chǔ)服務(wù)接口,非常適合于存儲(chǔ)大容量非結(jié)構(gòu)化的數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于SpringBoot整合Minio實(shí)現(xiàn)上傳文件的完整步驟,需要的朋友可以參考下2022-05-05Java實(shí)現(xiàn)簡(jiǎn)單的掃雷小程序
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單的掃雷小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04java拷貝指定目錄下所有內(nèi)容到minIO代碼實(shí)例
這篇文章主要介紹了java拷貝指定目錄下所有內(nèi)容到minIO代碼實(shí)例,創(chuàng)建桶 直接使用工具類先判斷,再創(chuàng)建即可,創(chuàng)建文件夾,需要注意以"/"結(jié)尾,實(shí)際也是在minIO上創(chuàng)建文件,只是作為目錄的表現(xiàn)形式展示,需要的朋友可以參考下2024-01-01JDK8新特性-java.util.function-Function接口使用
這篇文章主要介紹了JDK8新特性-java.util.function-Function接口使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04