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