關於接口的簡單理解

第五章 接口

5.1 接口概述

常見的貓狗案例 貓和狗它們僅僅提供一些基本功能。java

但有一些不是動物自己就具有的,好比:貓鑽火圈,狗跳高等功能設計

是在後面的培養中訓練出來的,這種額外的功能,java提供了接口表示。code

5.2 接口特色

A:接口用關鍵字interface表示

[public] interface 接口名{
}
  1. 接口中的方法不能具體實現,接口中的方法必須爲抽象方法繼承

  2. 接口中通常不定義變量,由於接口中的變量會被默認指定爲 public static final 變量(只能是)接口

B:類實現接口用implements 表示

class 類名 implements 接口1,接口2,[....]{
}

1.一個類(非抽象類)能夠遵循多個接口,而且須要實現(重寫)該接口中全部的方法ci

2.子類爲抽象類的意義不大class

5.3 接口的成員特色

A:成員變量
只能是常量

​ 默認修飾符:public static final變量

B:構造方法

​ 沒有構造方法方法

C:成員方法

​ 只能是抽象的im

​ 默認修飾符:public abstract

5.4 抽象類和接口的區別(重要)

咱們從咱們實際設計場景中來切入這個話題

先來舉一個簡單的例子:

狗都具備 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(),如何增長這個行爲呢?

思考:

  1. 將鑽火圈方法與前面兩個方法一同寫入抽象類中,可是這樣的話,但凡繼承這個抽象類狗都具備了鑽火圈技能,明顯不合適

  2. 將鑽火圈方法與前面兩個方法一同寫入接口中,當須要使用鑽火圈功能的時候,就必須實現 接口中的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技術的公衆號:理想二旬不止

相關文章
相關標籤/搜索