【Java课堂】接口详解
目錄
1、接口的概念
2、語法規則
實現接口有幾條規范需要我們注意
3、接口的使用
4、接口的特性
5、實現多個接口
6、接口間的繼承
1、接口的概念
? ? ? ? 接口顧名思義,就是我們身邊常用的行為規范。而接口在我們身邊比比皆是,就比如電腦上的USB接口。USB接口插入U盤、鼠標、鍵盤....所有符合USB協議的設備,它把我們能用到的設備插頭都統一起來,使得我們不用買大量的轉換器,方便我們使用。
總結來說:接口就是公共的行為規范,大家在實現時,只要符合規范標準,就可以通用。
在Java中,接口可以看成是:多個類的公共規范,是一種引用數據類型。
????????2、語法規則
接口的定義格式與定義類的格式基本相同,將class關鍵字換成interface即可定義接口
interface 接口名稱{//成員變量 必須要初始化public static final int a = 10;int b = 10;//抽象方法public abstract void method1();void method2();//接口的默認方法default void func()1{...}//接口靜態成員方法static void func2(){...} }實現接口有幾條規范需要我們注意
書寫接口規范
????????3、接口的使用
?????????接口跟抽象類一樣不能直接實例化,必須要有一個“實現類”來“實現”該接口,實現接口中的所有抽象方法。而類和接口的關系是使用 implements 來關聯的
public class 類名稱 implements 接口名稱{ // ... }注意:子類和父類之間是extends 繼承關系,類和接口之間是 implements 實現關系
? ? ? ? 當類實現了接口,那么該類就必須實現接口中所有的抽象方法,否則編譯器會報錯
在IDEA中,有快捷鍵實現接口中的抽象方法。
首先把鼠標觸碰implements,按下Alt+Shift+Enter 或點擊 Implement methods 就會出現所有要實現抽象方法,點擊OK即可完成
?此外,接口也可以應用具體實現類。【向上轉型】
interface IShape{void draw(); }class Rect implements IShape{@Overridepublic void draw() {System.out.println("畫一個正方形");} }class Flower implements IShape{@Overridepublic void draw() {System.out.println("畫一朵花");} }public class test {public static void drawMap(IShape iShape){iShape.draw();}public static void main(String[] args) {drawMap(new Rect());drawMap(new Flower());IShape iShape = new Flower();//向上轉型} }?
????????4、接口的特性
1.接口類型是一種引用類型,但是不能直接new接口的對象
?2.接口中的每一個方法都是 public 的抽象方法,即接口中普通側成員方法會被隱式指定為 public abstract,且只能是 public abstract,其他修飾符都會報錯。
?3.接口中的方法一般不能在接口中實現,基本上都在實現接口的類來實現(在接口中default 修飾的方法可以具體實現)
4.重寫接口方法時,所加訪問權限必須要大于重寫方法的訪問權限
? ? ? ? 如下,draw() 方法默認是public修飾。Rect類要重寫draw方法,就必須要加public,否則會報錯
?5.接口中可以含有變量,但是會被隱式指定為 public static final 變量
interface IShape{double kind = 2.0;//默認被:public static final 修飾void draw();//默認public } public class test {public static void main(String[] args) {System.out.println(IShape.kind);//可以通過接口名訪問//IShape.brand = 2.0;//無法為最終變量brand 分配值} }?6.接口中不能有靜態代碼塊和構造方法
?7.接口雖然不是類,但是接口編譯完成后字節碼文件的后綴格式也是.class
????????5、實現多個接口
在Java中,一個類只能繼承一個父類,不支持多繼承,而一個類卻可以實現多個接口
? ? ? ? “假設有一條?魚 和一只 鳥,讓我們來寫一串代碼來實現它們的行為”。
???首先它們都是動物,我們都能給它們起名字,比如 “小花”、“小飛”....
???那我們能不能定義抽象類,來統一規范動物的特性和行為。如下
abstract class Animal{public String name;public Animal(String name) {this.name = name;} }? ? ? ? 然后同時創建一個 魚?類和一個鳥類,并繼承Animal類
class Fish extends Animal{public Fish(String name) {super(name);} }class Bird extends Animal{public Bird(String name) {super(name);} }?現在我們來思考一下,魚和鳥都有什么行為?
魚能吃飯、能游泳
鳥能吃飯、能飛
他們共同的共性是吃飯,不同的特性是游泳和飛
特性分析出來了,那我們該如何實現呢?
思考:我們能不能在 Animal 類中寫 eating、swimming、flying這三個方法,并讓子類繼承并重寫這些方法呢?
答:肯定是不行的,這樣雖然能讓Fish類和Bird類獲各自的行為,但是魚也獲得了‘上天’【flying】的能力,鳥也獲得了‘下海’【swimming】的能力,所以這樣做法不行。
?那假設我另創建一個游泳類,在類中實現游泳方法,并讓Fish繼承,大家想想這樣可以嗎?答案肯定也是不行的。
?Java中只能單繼承,所以這時我們要用接口來實現這一功能
既然我們不能把 魚 和 鳥 的所有行為特性都寫到父類當中,那么我們就把他們相同的特性行為寫到父類中,然后再把他們特有的行為寫到接口中。
所以我們可以直接定義三個接口,分別為ISwimming、IFlying、IEating。分比讓Fish類和Bird類實現,下面以Fish類實現接口為例
此時我們可以定義三個方法來方便我們調用swmming、flying、eating等
這些方法分別用相應的接口接收參數,并在main函數中調用?
?結果如下
?此時如果 bird 能充當 swim 方法的參數嗎?很明顯不能。因為Bird類沒有實現ISwimming接口。但是bird 和 fish 都能調用 eating 方法,這是因為 Fish 和 Bird 類都實現了IEating接口
interface ISwimming{void swimming(); }interface IFlying{void flying(); }interface IEating{void eating(); } abstract class Animal{public String name;public Animal(String name) {this.name = name;} }class Fish extends Animal implements ISwimming,IEating{public Fish(String name) {super(name);}@Overridepublic void swimming() {System.out.println(name+"正在游泳");}@Overridepublic void eating() {System.out.println(name+"正在吃魚食");} }class Bird extends Animal implements IFlying,IEating{public Bird(String name) {super(name);}@Overridepublic void flying() {System.out.println(name+"正在飛");}@Overridepublic void eating() {System.out.println(name+"正在此鳥糧");} }public class Test {public static void swim(ISwimming iSwimming){iSwimming.swimming();}public static void fly(IFlying iFlying){iFlying.flying();}public static void eat(IEating iEating){iEating.eating();}public static void main(String[] args) {Fish fish = new Fish("小魚");swim(fish);eat(fish);Bird bird = new Bird("小鳥");fly(bird);eat(bird);} }?上面代碼展示了Java 面向對象編程中最常見的用法:一個類繼承一個父類,同時實現多個接口。
繼承表達的含義時 is-a 含義,而接口表達的含義時 具有xxxx特性
- 魚是一種動物,能吃,能游泳
- 鳥也是一種動物,能吃,能飛
?這樣設計什么好處呢?可以我們 👨?💻程序員👩?💻 時時刻刻記著多態的好處,忘記類型。有了接口之后,類的使用中就不必關注具體類型,而只關注某個類是否具有某種能力。
????????6、接口間的繼承
在Java中,類和類之間是單繼承的,一個類可以實現多個接口,接口與接口之間可以多繼承。即:用接口可以達到多繼承的目的。
接口可以繼承一個接口, 達到復用的效果. 使用 extends 關鍵字.
interface IRunning {void run(); } interface ISwimming {void swim(); }// 兩棲的動物, 既能跑, 也能游 interface IAmphibious extends IRunning, ISwimming { }class Frog implements IAmphibious {... }通過接口繼承創建一個新的接口 IAmphibious 表示 "兩棲的". 此時實現接口創建的 Frog 類, 就繼續要實現 run 方法, 也需要實現 swim 方法。
接口間的繼承相等于把多個接口合并在一起。
總結
以上是生活随笔為你收集整理的【Java课堂】接口详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 虚拟麦克风音频输入_塑电竞强音 为专业而
- 下一篇: 图片饱和度更改,c#,winform