Java中的接口及其應(yīng)用場(chǎng)景解讀
一、接口的特點(diǎn)
1.如果一個(gè)抽象類中的所有方法都是抽象的,則可以將這個(gè)類定義為Java中的另一種形式——接口。接口是一種特殊的抽象類,接口中只有全局常量和抽象方法,是一種更純粹的抽象概念。
2.在JDK8中,對(duì)接口進(jìn)行了重新定義,接口中除了有抽象方法外,還可以有默認(rèn)方法和靜態(tài)方法;默認(rèn)方法可以被繼承和覆寫,靜態(tài)方法不能被繼承和覆寫。
3.一般來說,接口的使用表示兩種場(chǎng)景:
- ①接口表示具備某種能力/行為,子類實(shí)現(xiàn)接口是并不是is a關(guān)系,而是具備這種能力或行為
- ②接口表示一種規(guī)范或者標(biāo)準(zhǔn)。
4.在接口中,定義抽象方法時(shí) public abstract關(guān)鍵字可以省略,定義全局常量時(shí) static final可以省略。
5.接口的子類可以實(shí)現(xiàn)多個(gè)父接口,接口也不能直接實(shí)例化對(duì)象,需要通過子類(普通類)向上轉(zhuǎn)型。
6.接口和接口之間也可以是繼承關(guān)系,但是接口絕對(duì)不能繼承一個(gè)類。
二、定義接口
1.interface關(guān)鍵字
與定義類不同的是,在定義接口的時(shí)候,不再使用class關(guān)鍵字,而是使用interface關(guān)鍵字來聲明。
語法格式:修飾符 interface 接口名 { }
創(chuàng)建一個(gè)USB接口,里面有兩個(gè)抽象方法
代碼如下:
public interface USB{ //表示插入 public abstract void plugIn(); //表示工作 public abstract void work(); }
2.implements關(guān)鍵字
子類使用implements關(guān)鍵字來實(shí)現(xiàn)接口,必須覆寫接口中所有的抽象方法
代碼如下:
public class KeyBoard implements USB { @Override public void plugIn() { System.out.println("安裝鍵盤驅(qū)動(dòng)"); } @Override public void work() { System.out.println("鍵盤正常工作"); } }
三、應(yīng)用場(chǎng)景
1.接口表示規(guī)范
USB接口表示一種規(guī)范,鼠標(biāo)鍵盤耳機(jī)等等這些外設(shè)都屬于USB接口的子類,我們?cè)谌粘I钪惺褂秒娔X的時(shí)候,我們并不關(guān)心到底哪個(gè)具體設(shè)備插入了我們的電腦,只要這個(gè)設(shè)備滿足了USB接口,就都能被電腦識(shí)別并使用。
就是說,一個(gè)接口,可以接受無數(shù)種設(shè)備,只要這個(gè)設(shè)備滿足USB接口,都可以插入電腦并被電腦識(shí)別。
兼容所有的USB子類對(duì)象。
public interface USB{ //表示插入 public abstract void plugIn(); //表示工作 public abstract void work(); }
public class Mouse implements USB{ @Override public void plugIn() { System.out.println("安裝鼠標(biāo)驅(qū)動(dòng)"); } @Override public void work() { System.out.println("鼠標(biāo)正常工作"); } }
public class KeyBoard implements USB { @Override public void plugIn() { System.out.println("安裝鍵盤驅(qū)動(dòng)"); } @Override public void work() { System.out.println("鍵盤正常工作"); } }
public class Camera implements USB{ @Override public void plugIn() { System.out.println("安裝相機(jī)驅(qū)動(dòng)中"); } @Override public void work() { System.out.println("相機(jī)開始正常工作"); } }
//電腦這個(gè)類不是USB接口的子類,他是USB規(guī)范的使用者 public class Computer { public static void main(String[] args) { Computer computer = new Computer(); Mouse mouse = new Mouse(); Keyboard keyboard = new Keyboard(); Camera camera = new Camera(); computer.fun(mouse); computer.fun(keyboard); computer.fun(camera); } /** *為什么此時(shí)fun方法的參數(shù)是USB usb呢?如果我們寫成fun(Mouse mouse),那么這個(gè)fun只能識(shí)別鼠標(biāo),其他的根本識(shí)別不了,我們得寫好多個(gè)方法去實(shí)現(xiàn)。 *我們這里用他們共同的接口當(dāng)做參數(shù),這樣不管傳進(jìn)來的是什么設(shè)備,只要你實(shí)現(xiàn)了USB這個(gè)接口,那你就可以被識(shí)別 *假設(shè)我們現(xiàn)在多了一個(gè)子類Earphone(耳機(jī))類,實(shí)現(xiàn)了USB接口,那我們的fun方法里一行多的代碼都不用寫,直接實(shí)例化對(duì)象,將引用名傳進(jìn)去就行。 */ public void fun(USB usb) { usb.plugIn(); usb.work(); } }
2.接口表示能力/行為
接口允許多實(shí)現(xiàn),一個(gè)類可以具備多個(gè)能力,同時(shí)實(shí)現(xiàn)多個(gè)父接口,若實(shí)現(xiàn)多個(gè)父接口,子類(普通類),必須覆寫所有的抽象方法。
代碼如下:
//游泳接口,表示具備游泳這個(gè)行為 public interface ISwim { ? ? //可以省略public abstrac //public abstract void swim(); ? ? void swim(); }
//具備跑這個(gè)行為 public interface IRun { //可以省略public abstrac ? ? void run(); //public abstract void run(); }
//表示能飛 public interface IFly { //public abstract void fly(); //可以省略public abstrac ? ? void fly(); }
//只具備跑的行為 public class Rabbit implements IRun{ ? ? @Override ? ? public void run() { ? ? ? ? System.out.println("兔子在跑~"); ? ? } }
//具備跑和游泳的能力 public class Dog implements IRun,ISwim{ ? ? @Override ? ? public void run() { ? ? ? ? System.out.println("狗子在跑~"); ? ? } ? ? @Override ? ? public void swim() { ? ? ? ? System.out.println("狗子在游泳~"); ? ? } }
//三種能力都具備 public class Duck implements IRun,ISwim,IFly{ ? ? @Override ? ? public void fly() { ? ? ? ? System.out.println("鴨子在飛~"); ? ? } ? ? @Override ? ? public void run() { ? ? ? ? System.out.println("鴨子在跑~"); ? ? } ? ? @Override ? ? public void swim() { ? ? ? ? System.out.println("鴨子在游泳~"); ? ? } }
//定義一個(gè)測(cè)試類進(jìn)行測(cè)試 public class Test { ? ? public static void main(String[] args) { ? ? ? ? IRun run = new Rabbit(); ? ? ? ? IRun run1 = new Dog(); ? ? ? ? ISwim swim = new Dog(); ? ? ? ? IFly fly = new Duck(); ? ? ? ? run.run(); ? ? ? ? run1.run(); ? ? ? ? swim.swim(); ? ? ? ? fly.fly(); ? ? } }
運(yùn)行結(jié)果如下:
四、接口和類之間的關(guān)系
接口和子類之間是一種混合關(guān)系,不具備is a關(guān)系。上面的Dog和Rabbit都具備跑的能力,但是這兩個(gè)類彼此之間沒啥關(guān)系。
1.當(dāng)一個(gè)類實(shí)現(xiàn)接口時(shí),如果這個(gè)類是抽象類,只需要實(shí)現(xiàn)接口種的部分抽象方法,如果是一個(gè)普通類,則需要覆寫接口中所有的抽象方法。
2.一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,接口之間用英文逗號(hào)隔開。
3.接口之間可以通過extends關(guān)鍵字實(shí)現(xiàn)繼承,并且一個(gè)接口可以同時(shí)繼承多個(gè)接口,接口之間用英文逗號(hào)隔開。
4.一個(gè)類在繼承一個(gè)類的同時(shí),還可以實(shí)現(xiàn)多個(gè)接口,此時(shí),extends關(guān)鍵字必須位于implements關(guān)鍵字之前。
語法如下:
修飾符 class 類名 extends 父類名 implements 接口1,接口2{}
public class Test { } interface IA{ //接口中抽象方法可以省略public abstract void testA(); } interface IB{ void testB(); } //接口之間存在繼承關(guān)系,可以多繼承。 //接口堅(jiān)決不能繼承一個(gè)類 interface IC extends IA,IB{ //IC接口同時(shí)繼承多個(gè)父接口,繼承了所有的抽象方法 //子類實(shí)現(xiàn)IC接口時(shí),必須覆寫所有的抽象方法 } class CImpl implements IC{ @Override public void testA() { } @Override public void testB() { } } abstract class Person{ } //一個(gè)類繼承一個(gè)類,同時(shí)實(shí)現(xiàn)多個(gè)接口 //修飾符 class 類名 extends 父類名 implements 接口1,接口2{} class China extends Person implements IA,IB{ @Override public void testA() { } @Override public void testB() { } }
五、接口的命名規(guī)范
為了區(qū)分接口和類,命名使用 I 開頭,IRun,ISwim等等,子類實(shí)現(xiàn)一個(gè)接口時(shí),命名以相應(yīng)的接口開頭,以impl結(jié)尾。
例如:如果是IRun的子類,Runimpl(不是強(qiáng)制要求,但盡量做到)。
如果子類實(shí)現(xiàn)多個(gè)父接口,不需要使用此規(guī)范來命名
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于spring中不同包中類名相同報(bào)錯(cuò)問題的總結(jié)
這篇文章主要介紹了關(guān)于spring中不同包中類名相同報(bào)錯(cuò)問題的總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06Spring整合Quartz分布式調(diào)度的示例代碼
本篇文章主要介紹了Spring整合Quartz分布式調(diào)度的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04Java實(shí)現(xiàn)字節(jié)數(shù)B轉(zhuǎn)化為KB、MB、GB的方法示例【測(cè)試可用】
這篇文章主要介紹了Java實(shí)現(xiàn)字節(jié)數(shù)B轉(zhuǎn)化為KB、MB、GB的方法,結(jié)合實(shí)例形式分析了java字節(jié)數(shù)的轉(zhuǎn)換運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-08-08Intellij IDEA 配置Subversion插件實(shí)現(xiàn)步驟詳解
這篇文章主要介紹了Intellij IDEA 配置Subversion插件實(shí)現(xiàn)步驟詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之學(xué)生管理系統(tǒng)的實(shí)現(xiàn)
只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+Springboot+Maven+mybatis+Vue+Mysql實(shí)現(xiàn)學(xué)生管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2022-03-03MyBatis學(xué)習(xí)教程(二)—如何使用MyBatis對(duì)users表執(zhí)行CRUD操作
這篇文章主要介紹了MyBatis學(xué)習(xí)教程(二)—如何使用MyBatis對(duì)users表執(zhí)行CRUD操作的相關(guān)資料,需要的朋友可以參考下2016-05-05spring boot項(xiàng)目導(dǎo)入依賴后代碼報(bào)錯(cuò)問題的解決方法
這篇文章主要給大家介紹了關(guān)于spring boot項(xiàng)目導(dǎo)入依賴后代碼報(bào)錯(cuò)問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08編寫調(diào)用新浪微博API的Java程序來發(fā)送微博
這篇文章主要介紹了編寫調(diào)用新浪微博API的Java程序來發(fā)送微博的方法,只是展示了一個(gè)基本的程序框架而非一個(gè)完整的圖形化軟件:)需要的朋友可以參考下2015-11-11java設(shè)計(jì)簡(jiǎn)單學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)簡(jiǎn)單學(xué)生管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09