5.1
接口概述
常見的貓狗案例 貓和狗它們僅僅提供一些基本功能。
但有一些不是動物本身就具備的,比如:貓鑽火圈,狗跳高等功能
是在後面的培養中訓練出來的,這種額外的功能,java提供了接口表示。

5.2
接口特點
A:接口用關鍵字interface表示
[public] interface 接口名{
}
複制
1. 接口中的方法不能具體實作,接口中的方法必須為抽象方法
2. 接口中一般不定義變量,因為接口中的變量會被預設指定為 public static final 變量(隻能是)
B:類實作接口用implements 表示
class 類名 implements 接口1,接口2,[....]{
}
複制
1.一個類(非抽象類)可以遵循多個接口,并且需要實作(重寫)該接口中所有的方法
2.子類為抽象類的意義不大

5.3
接口的成員特點
A:成員變量
隻能是常量
預設修飾符:public static final
B:構造方法
沒有構造方法
C:成員方法
隻能是抽象的
預設修飾符: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() () {
//....
}
}
複制
總結:
繼承是一個 "是不是"的關系,而 接口 實作則是 "有沒有"的關系。如果一個類繼承了某個抽象類,則子類必定是抽象類的種類,而接口實作則是有沒有、具備不具備的關系,比如狗是否能鑽火圈,能則可以實作這個接口,不能就不實作這個接口。