内容:
1、接口的概念與定義
2、類實作接口
3、接口的特點
4、接口和抽象類的差別
(1)類和接口
類:具有相同屬性和功能的事物集合
接口:接口是功能的集合,也就是方法的集合,也就是說接口中隻能定義方法,不能定義普通的成員變量
而且接口中的成員方法必須都是抽象的,可以了解接口是比抽象類更加抽象的一種類
(2)接口的定義
定義類的關鍵字:class
定義抽象類的關鍵字:abstract
定義接口的關鍵字:interface
定義接口所在的仍為.java檔案,雖然聲明時使用的為interface關鍵字的編譯後仍然會産生.class檔案,
這點可以讓我們将接口看做是一種隻包含了功能聲明的特殊類
格式如下:
1 public interface 接口名{
2 // 成員變量: 不能定義普通的成員變量
3 // 成員方法: 必須都是抽象
4 public abstract 傳回值類型 方法名();
5 }
使用interface代替了原來的class,其他步驟與定義類相同:
- 接口中的方法均為公共通路的抽象方法
- 接口中無法定義普通的成員變量
(3)各種類型之間的關系
- 類和類之間:繼承,隻能是單繼承,一個子類隻能有一個父類
- 接口和接口之間:繼承,可以多繼承,一個子接口可以有多個直接父接口
- 類和接口之間:不叫繼承,叫實作(implements),可以多實作,一個類可以實作多個接口
類與接口的關系為實作關系,即類實作接口。實作的動作類似繼承,隻是關鍵字不同,實作使用implements
其他類(實作類)實作接口後,就相當于聲明:”我應該具備這個接口中的功能”。實作類仍然需要重寫方法以實作具體的功能
格式:
1 class 實作類 implements 接口 {
2 // 重寫接口中所有方法
3 }
在類實作接口後,該類就會将接口中的抽象方法繼承過來,此時該類需要重寫該抽象方法,完成具體的邏輯
- 接口中定義功能,當需要具有該功能時,可以讓類實作該接口,隻聲明了應該具備該方法,是功能的聲明
- 在具體實作類中重寫方法,實作功能,是方法的具體實作
于是,通過以上兩個動作将功能的聲明與實作分開,此時請思考:類是現實事物的描述,接口是功能的集合
接口中成員的特點如下:
- 接口中可以定義成員變量,但是變量必須用public static final修飾(固定修飾符),這樣的變量其實是常量,其值不能改變
- 接口中可以定義方法,方法也有固定的修飾符,public abstract
- 接口不可以建立對象(抽象類也不可以建立對象)
- 實作類必須覆寫掉接口中所有的抽象方法後,實作類才可以執行個體化。否則實作類是一個抽象類
示例代碼:
1 // 接口
2 public interface MyInter {
3 // 接口的成員變量(常量)
4 public static final int a = 3;
5 // 接口的方法
6 public abstract void show();
7 }
注:固定修飾符可以不寫也可以按心情想寫哪個寫哪個,但是不寫不代表沒有,不寫時編譯器會自動添加
在開發中最常用的模式:
1 // 一個類繼承一個抽象類 同時實作多個接口
2 public class A extends AbstractClassB implements 接口A, 接口B{
3
4 }
注:A中必須重寫抽象類中的抽象方法以及所有接口中的抽象方法!
接口的特點:
- 接口可以繼承接口 A接口繼承B接口後,A接口便擁有了A、B兩個接口中所有的抽象方法
- Java支援一個類同時實作多個接口,或一個接口同時繼承多個接口
- 類可以在繼承一個類的同時,實作多個接口
- 接口與父類的功能可以重複,均代表要具備某種功能,并不沖突
相同點:
- 都位于繼承的頂端,用于被其他類實作或繼承
- 都不能直接執行個體化對象
- 都可以包含抽象方法,其子類都必須覆寫重寫或實作這些抽象方法
差別:
- 抽象類為部分方法提供實作,避免子類重複實作這些方法,提高代碼重用性;
- 接口隻能包含抽象方法,而抽象類可以包含抽象方法也可以包含普通方法;
- 一個類隻能繼承一個直接父類(可能是抽象類),卻可以實作多個接口;(接口彌補了Java的單繼承)
- 抽象類為繼承體系中的共性内容,接口為繼承體系外的擴充功能
二者的選用:
- 優先選用接口,盡量少用抽象類
- 需要定義子類的行為,又要為子類提供共性功能時才選用抽象類
too young too simple sometimes native!