Java中間的接口用法詳解
基本特性
我們先看一下接口的基本特性
- 接口的定義需要使用關(guān)鍵字interface;
- 接口定義的所有方法默認(rèn)都是public abstract;
- 當(dāng)一個具體的class? 去實現(xiàn)一個interface?時,需要使用implements 關(guān)鍵字;
- 接口之間是可以多繼承,而類是只能單繼承的;
如下所示,我們定義一個接口;
package com.example.demo.inter; import java.io.Serializable; import java.util.RandomAccess; public interface ITest extends Serializable, RandomAccess { public abstract String sayHello(); String sayHello2(); }
默認(rèn)方法
在 JDK 8? 之前接口是不支持默認(rèn)方法的,在 JDK 8? 之后接口支持默認(rèn)方法,默認(rèn)方法采用關(guān)鍵詞 default 聲明。
public interface ITest extends Serializable, RandomAccess { public abstract String sayHello(); String sayHello2(); default String sayHello3() { return "hello3"; } }
默認(rèn)方法跟抽象方法不一樣,接口中定義的抽象方法,當(dāng)接口被其他類實現(xiàn)的時候都需要全部實現(xiàn),但是默認(rèn)方法是不需要被實現(xiàn)就可以直接使用的,類似于直接調(diào)用父類的方法一樣,所以在很多時候,我們已經(jīng)繼承了一個類,還想有一個能用但是不想每個子類都實現(xiàn)的方法的時候,就可以考慮增加一個接口的默認(rèn)方法來使用,簡單來說就是實現(xiàn)類可以不覆寫 default 方法。
default方法存在的目的是,在我們已經(jīng)完善的項目中,如果我們直接給一個接口增加一個方法,在沒有默認(rèn)方法的時候就需要給所有的實現(xiàn)類都實現(xiàn)對應(yīng)的方法,但是這個方法又不一定是每個實現(xiàn)類都需要的,所以這個時候默認(rèn)方法就很好的解決了這個問題,我們只需要增加一個默認(rèn)方法,然后在需要使用的實現(xiàn)類中進(jìn)行實現(xiàn)或者使用就可以了,其他的實現(xiàn)類不需要改動任何的代碼。
標(biāo)記
接口還有一個很常見的功能那就是標(biāo)記功能,這么說可能你沒有印象,但是提到序列化接口 java.io.Serializable;? 你肯定知道,我們經(jīng)常在對應(yīng)的 POJO 中都會實現(xiàn)這個序列化接口,而這個序列化的接口如果看過源碼的小伙伴肯定知道里面是沒有內(nèi)容的。
同樣的功能除了序列化的接口,類似的空間接口還有很多,比如 java.util.RandomAccess? 也是空間接口,之前阿粉也寫過關(guān)于 RandomAccess? 這個接口的用途,感興趣的可以再去看看。RandomAccess 明明是個空接口,能有什么用呢?
通過源碼我們可以知道 RandomAccess 是用來標(biāo)識子類是否實現(xiàn)了該接口,如果實現(xiàn)了則走實現(xiàn)了的邏輯,沒有實現(xiàn)就走沒有實現(xiàn)的邏輯,所以我們在日常開發(fā)中也可以利用這個特性,當(dāng)我們有不同的子類需要根據(jù)情況進(jìn)行不同的實現(xiàn)邏輯的時候就可以采用定義一個空接口來標(biāo)記一下,方便后面的處理。
靜態(tài)方法
跟默認(rèn)方法一樣,JDK 8 還支持在接口中增加靜態(tài)方法,雖然說在接口中定義靜態(tài)方法的做法不常見,但是當(dāng)需要使用的時候也是可以支持的,避免在創(chuàng)建一個單獨的工具類,跟在類中定義的靜態(tài)方法一樣,我們可以直接通過接口名稱引用靜態(tài)方法,當(dāng)然靜態(tài)變量也是可以的,使用方法一樣。
public interface ITest extends Serializable, RandomAccess { public abstract String sayHello(); String sayHello2(); default String sayHello3() { System.out.println(sayHello4()); return "hello3"; } public static String sayHello4() { return "hello4"; } }
私有方法
大家有沒有注意到,上面不管是默認(rèn)方法還是靜態(tài)方法其實都是 public? 公開的,可以讓實現(xiàn)類或者其他類直接使用,那有沒有可能在接口中定義一個私有方法呢?在 JDK 9? 之前是不可以的,JDK 9 卻支持了,如下所示
private void privateMethod() { System.out.println("private私有方法被調(diào)用"); } private static void privateStaticMethod() { System.out.println("private私有靜態(tài)方法被調(diào)用"); }
從官方的文檔中我們可以找到下面的描述,在 JDK 9 中接口支持私有方法,主要用于不同的非抽象方法中共享代碼。
我們可以看到在 JDK 9 這樣寫是可以的
但是在 JDK8? 就不行了,是無法編譯通過的,會提示不允許使用 private 修飾符。
總結(jié)
今天小編給大家總結(jié)了一個接口的使用方法,后面在日常的開發(fā)中我們不單單只是在接口中定義抽象方法,也可以根據(jù)需求增加默認(rèn)方法或者私有方法,以及在需要用到標(biāo)記的時候也可以通過定義一個空接口來實現(xiàn),怎么樣是不是很棒,感覺動起來吧
以上就是Java中間的接口用法詳解的詳細(xì)內(nèi)容,更多關(guān)于Java中間接口的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java中LocalDate的詳細(xì)方法舉例總結(jié)
這篇文章主要給大家介紹了關(guān)于Java中LocalDate詳細(xì)方法舉例的相關(guān)資料,LocalDate主要是用來處理日期的類,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09JAVA實現(xiàn)監(jiān)測tomcat是否宕機(jī)及控制重啟的方法
這篇文章主要介紹了JAVA實現(xiàn)監(jiān)測tomcat是否宕機(jī)及控制重啟的方法,可實現(xiàn)有效的檢測及控制tomcat服務(wù)器運行,具有一定參考借鑒價值,需要的朋友可以參考下2015-08-08java BASE64Encoder詳細(xì)介紹及簡單實例
這篇文章主要介紹了java BASE64Encoder詳細(xì)介紹及簡單實例的相關(guān)資料,需要的朋友可以參考下2017-01-01Java中JSON字符串進(jìn)行各種轉(zhuǎn)換的方法小結(jié)
Gson和Hutool的JSONUtil都是常用的用于處理JSON數(shù)據(jù)的工具庫,它們提供了簡單易用的API來進(jìn)行JSON字符串的解析、轉(zhuǎn)換和操作,下面就跟隨小編一起學(xué)習(xí)一下如果使用他們實現(xiàn)JSON字符串的各種轉(zhuǎn)換吧2024-01-01java處理數(shù)據(jù)庫不支持的emoji表情符問題解決
這篇文章主要介紹了java處理數(shù)據(jù)庫不支持的emoji表情符問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09