常見的貓狗案例 貓和狗它們僅僅提供一些基本功能。java
但有一些不是動物自己就具有的,好比:貓鑽火圈,狗跳高等功能設計
是在後面的培養中訓練出來的,這種額外的功能,java提供了接口表示。code
[public] interface 接口名{ }
接口中的方法不能具體實現,接口中的方法必須爲抽象方法繼承
接口中通常不定義變量,由於接口中的變量會被默認指定爲 public static final 變量(只能是)接口
class 類名 implements 接口1,接口2,[....]{ }
1.一個類(非抽象類)能夠遵循多個接口,而且須要實現(重寫)該接口中全部的方法ci
2.子類爲抽象類的意義不大class
只能是常量
默認修飾符:public static final變量
沒有構造方法方法
只能是抽象的im
默認修飾符:public abstract
咱們從咱們實際設計場景中來切入這個話題
先來舉一個簡單的例子:
狗都具備 eat() 、sleep() 方法,咱們分別經過抽象類和接口定義這個抽象概念
//經過抽象類定義 public abstract class Dog { public abstract void eat(); public abstract void sleep(); }
//經過接口定義 public interface Dog { public abstract void eat(); public abstract void sleep(); }
可是咱們如今若是須要讓狗擁有一項特殊的技能——鑽火圈 DrillFireCircle(),如何增長這個行爲呢?
思考:
將鑽火圈方法與前面兩個方法一同寫入抽象類中,可是這樣的話,但凡繼承這個抽象類狗都具備了鑽火圈技能,明顯不合適
將鑽火圈方法與前面兩個方法一同寫入接口中,當須要使用鑽火圈功能的時候,就必須實現 接口中的eat() 、sleep() 方法(重寫該接口中全部的方法)顯然也不合適
那麼該如何解決呢 ? 咱們能夠仔細想想,eat和sleep都是狗自己所應該具備的一種行爲,而鑽火圈這種行爲則是後天訓練出來的,只能算是對狗類的一種附加或者延伸, 二者不該該在同一個範疇內,因此咱們考慮將這個單獨的行爲,獨立的設計一個接口,其中包含DrillFireCircle()方法, Dog設計爲一個抽象類, 其中又包括eat() 、sleep() 方法.
一個SpecialDog便可繼承Dog類而且實現DrillFireCircle()接口
下面給出代碼:
//定義接口,含有鑽火圈方法 public interface DrillFireCircle() { public abstract void drillFireCircle(); } //定義抽象類狗類 public abstract class Dog { public abstract void eat(); public abstract void sleep(); } //繼承抽象類且實現接口 class SpecialDog extends Dog implements drillFireCircle { public void eat() { //.... } public void sleep() { //.... } public void drillFireCircle() () { //.... } }
繼承是一個 "是否是"的關係,而 接口 實現則是 "有沒有"的關係。若是一個類繼承了某個抽象類,則子類一定是抽象類的種類,而接口實現則是有沒有、具有不具有的關係,好比狗是否能鑽火圈,能則能夠實現這個接口,不能就不實現這個接口。
若是內容中有什麼不足,或者錯誤的地方,歡迎你們給我留言提出意見, 蟹蟹你們 !^_^
若是能幫到你的話,那就來關注我吧!
在這裏的咱們素不相識,卻都在爲了本身的夢而努力 ❤
一個堅持推送原創Java技術的公衆號:理想二旬不止