Java
中的 接口
定義爲用於指定實現類行爲的抽象類型,Java接口包含 靜態常量
和 抽象方法
, 1.8以後還有 默認方法
與 靜態方法
。一個類能夠實現多個接口。
在Java中,接口是使用 interface
關鍵字聲明的。在 JDK8
以前接口中的全部方法都是 隱式公開
和 抽象
的, 1.8版本以後能夠在接口中定義靜態方法與使用 default
聲明的帶 方法體
的方法。java
抽取一系列對象的公共特徵, 聲明方法後進行統一實現, 例如貓和老鼠都是動物, 均可以爬或者叫等等, 這個時候咱們定義一個動物接口, 聲明爬行和叫聲的公共抽象方法, 建立貓和老鼠的類進行實現動物接口 markdown
優勢: 當增長一個公共抽象方法, 例如在動物接口中增長 毛色
方法, 這樣咱們不用去用腦去記憶有多少動物實現了它, 由於編譯的時候會報錯誤, 很清晰的給動物實現類增長方法, 而無需去擔憂漏掉某個動物沒有毛色 ide
代碼實現: code
interface Animal { public void move(); } class Cat implements Animal { public void move(){ System.out.println("貓行走的方法..."); } } class Dog implements Animal { public void move(){ System.out.println("狗行走的方法..."); } }
給動物增長一個毛色 對象
interface Animal { // ...其餘方法 public void color(); }
這個時候若是Cat
和Dog
類若是不重寫color
方法的話,就會編譯報錯 blog
之前的接口向後兼容性很差, 例如我想在動物類中增長一個如何食用該動物, 那麼總不能每一個動物都要實現吧, 因此就須要這種能夠不實現這個方法接口
interface Animal { default void howToEat(){ System.out.println("Animal:實現了這個接口的類能夠不實現這個方法"); } }
那麼問題來了, 假若有一個兔子
類, 在實現了Animal
的同時又實現了Mammal
(哺乳動物), 而兩個接口中都包含howToEat
方法 get
interface Mammal { default void howToEat(){ // 實現了這個接口的類能夠不實現這個方法 System.out.println("Mammal:哺乳動物食用方法..."); } } public class Rabbit implements Animal, Mammal{ }
上述代碼編譯出錯, 以下: it
這個時候咱們就要重寫howToEat
方法了 編譯
public class Rabbit implements Animal, Mammal { @Override public void howToEat() { System.out.println("麻辣兔頭"); } }
假如我想獲取哺乳動物的腿的數量, 我又不想去調取其實現類, 或者每一個實現類寫其有幾條腿或者爪子什麼之類的
public interface Mammal { static int getLegByName(String name) { switch (name) { case "兔子": return 4; case "鴨子": return 2; default: return 0; } } }