目錄
- 一、接口的特點(diǎn)
- 二、定義接口
- 1.interface關(guān)鍵字
- 2.implements關(guān)鍵字
- 三、應(yīng)用場景
- 1.接口表示規(guī)范
- 2.接口表示能力/行為
- 四、接口和類之間的關(guān)系
- 五、接口的命名規(guī)范
- 總結(jié)
一、接口的特點(diǎn)
1.如果一個抽象類中的所有方法都是抽象的,則可以將這個類定義為Java中的另一種形式——接口。接口是一種特殊的抽象類,接口中只有全局常量和抽象方法,是一種更純粹的抽象概念。
2.在JDK8中,對接口進(jìn)行了重新定義,接口中除了有抽象方法外,還可以有默認(rèn)方法和靜態(tài)方法;默認(rèn)方法可以被繼承和覆寫,靜態(tài)方法不能被繼承和覆寫。
3.一般來說,接口的使用表示兩種場景:
- ①接口表示具備某種能力/行為,子類實(shí)現(xiàn)接口是并不是is a關(guān)系,而是具備這種能力或行為
- ②接口表示一種規(guī)范或者標(biāo)準(zhǔn)。
4.在接口中,定義抽象方法時 public abstract關(guān)鍵字可以省略,定義全局常量時 static final可以省略。
5.接口的子類可以實(shí)現(xiàn)多個父接口,接口也不能直接實(shí)例化對象,需要通過子類(普通類)向上轉(zhuǎn)型。
6.接口和接口之間也可以是繼承關(guān)系,但是接口絕對不能繼承一個類。
二、定義接口
1.interface關(guān)鍵字
與定義類不同的是,在定義接口的時候,不再使用class關(guān)鍵字,而是使用interface關(guān)鍵字來聲明。
語法格式:修飾符 interface 接口名 { }
創(chuàng)建一個USB接口,里面有兩個抽象方法
代碼如下:
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ū)動"); } @Override public void work() { System.out.println("鍵盤正常工作"); } }
三、應(yīng)用場景
1.接口表示規(guī)范
USB接口表示一種規(guī)范,鼠標(biāo)鍵盤耳機(jī)等等這些外設(shè)都屬于USB接口的子類,我們在日常生活中使用電腦的時候,我們并不關(guān)心到底哪個具體設(shè)備插入了我們的電腦,只要這個設(shè)備滿足了USB接口,就都能被電腦識別并使用。
就是說,一個接口,可以接受無數(shù)種設(shè)備,只要這個設(shè)備滿足USB接口,都可以插入電腦并被電腦識別。
兼容所有的USB子類對象。
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ū)動"); } @Override public void work() { System.out.println("鼠標(biāo)正常工作"); } }
public class KeyBoard implements USB { @Override public void plugIn() { System.out.println("安裝鍵盤驅(qū)動"); } @Override public void work() { System.out.println("鍵盤正常工作"); } }
public class Camera implements USB{ @Override public void plugIn() { System.out.println("安裝相機(jī)驅(qū)動中"); } @Override public void work() { System.out.println("相機(jī)開始正常工作"); } }
//電腦這個類不是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); } /** *為什么此時fun方法的參數(shù)是USB usb呢?如果我們寫成fun(Mouse mouse),那么這個fun只能識別鼠標(biāo),其他的根本識別不了,我們得寫好多個方法去實(shí)現(xiàn)。 *我們這里用他們共同的接口當(dāng)做參數(shù),這樣不管傳進(jìn)來的是什么設(shè)備,只要你實(shí)現(xiàn)了USB這個接口,那你就可以被識別 *假設(shè)我們現(xiàn)在多了一個子類Earphone(耳機(jī))類,實(shí)現(xiàn)了USB接口,那我們的fun方法里一行多的代碼都不用寫,直接實(shí)例化對象,將引用名傳進(jìn)去就行。 */ public void fun(USB usb) { usb.plugIn(); usb.work(); } }
2.接口表示能力/行為
接口允許多實(shí)現(xiàn),一個類可以具備多個能力,同時實(shí)現(xiàn)多個父接口,若實(shí)現(xiàn)多個父接口,子類(普通類),必須覆寫所有的抽象方法。
代碼如下:
//游泳接口,表示具備游泳這個行為 public interface ISwim { ? ? //可以省略public abstrac //public abstract void swim(); ? ? void swim(); }
//具備跑這個行為 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("鴨子在游泳~"); ? ? } }
//定義一個測試類進(jìn)行測試 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ī)范
為了區(qū)分接口和類,命名使用 I 開頭,IRun,ISwim等等,子類實(shí)現(xiàn)一個接口時,命名以相應(yīng)的接口開頭,以impl結(jié)尾。
例如:如果是IRun的子類,Runimpl(不是強(qiáng)制要求,但盡量做到)。
如果子類實(shí)現(xiàn)多個父接口,不需要使用此規(guī)范來命名
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持。
原文地址:https://blog.csdn.net/weixin_50262394/article/details/124631629