12.java 介面
概念
介面,在JAVA程式語言中是一個引用型別,是抽象方法的集合,介面通常以interface來宣告。一個類通過繼承介面的方式,從而來繼承介面的抽象方法。
介面中只能包含抽象方法和全域性常量。
介面無法被例項化,但是可以被實現。一個實現介面的類,必須實現介面內所描述的所有方法,否則就必須宣告為抽象類。另外,在 Java 中,介面型別可用來宣告一個變數,他們可以成為一個空指標,或是被繫結在一個以此介面實現的物件。
介面的宣告語法格式如下:
[訪問修飾符] interface 介面名稱 [extends 其他的介面名] { // 宣告全域性常量 (static final變數) // 抽象方法 }
介面有以下特性:
- 介面是隱式抽象的,當宣告一個介面的時候,不必使用abstract關鍵字。
- 介面中每一個方法也是隱式抽象的,宣告時同樣不需要abstract關鍵字。
- 介面中的方法都是公有的(public),public也可以省略。
- 介面的子類可以通過implements關鍵字實現多個介面。
- 介面的子類(如果不是抽象類)必須覆寫介面中的全部抽象方法。
- 介面的物件可以利用子類物件的向上轉型進行例項化賦值。
介面與類相似點:
- 一個介面可以有多個方法。
- 介面檔案儲存在 .java 結尾的檔案中,檔名使用介面名。
- 介面的位元組碼檔案儲存在 .class 結尾的檔案中。
- 介面相應的位元組碼檔案必須在與包名稱相匹配的目錄結構中。
介面與類的區別:
- 介面不能用於例項化物件。
- 介面沒有構造方法。
- 介面中所有的方法必須是抽象方法。
- 介面不能包含成員變數,除了全域性常量(static final定義)。
- 介面不是被類繼承了,而是要被類實現。
- 介面支援多繼承,可以使用extends繼承多個介面。
示例
interface A { public void print(); } interface B { public void get(); } class X implements A,B{ public void print(){ System.out.println("A介面的抽象方法"); } public void get(){ System.out.println("B介面的抽象方法"); } } public class testDemo { public static void main(String[] args) { /* X x = new X(); A a = x; //向上轉型 B b = x; //向上轉型 b.get(); */ A a = new X(); B b = (B)a; b.get(); System.out.println(a instanceof A); System.out.println(a instanceof B); System.out.println(a instanceof X); } } 輸出結果: B介面的抽象方法 true true true
總結:不要被引用變數所代表的型別所迷惑,而要看具體該引用變數所指向的例項物件(new 創建出來的型別)。
實際開發中介面的核心作用
- 定義不同層之間的操作標準,即定義一個標準。
- 表示一種操作能力,這種情況下,接口裡可能不包含任何方法。
- 將服務端的遠端方法暴露給客戶端。
抽象類和介面的對比
抽象類和介面在使用形式上非常類似.
區別點 | 抽象類 | 介面 |
---|---|---|
關鍵字 | abstract class | interface |
組成 | 構造方法、普通方法、抽象方法、static方法、常量、變數 | 抽象方法、全域性常量 |
子類使用 | class 子類 extends 抽象類 | class 子類 implement 介面1,介面2,... |
關係 | 抽象類可以實現多個介面 | 介面不能繼承抽象類,可以繼承多個父介面 |
許可權 | 抽象類可以使用各種許可權 | 介面只能使用public |
繼承限制 | 單繼承 | 多繼承,子類可以實現多個介面 |
子類 | 子類都必須重寫全部的抽象方法 | 同抽象類 |
例項化 | 無法直接例項化,依靠子類物件的向上轉型進行物件的例項化 | 同抽象類 |
什麼時候使用抽象類和介面
- 如果你擁有一些方法並且想讓它們中的一些有預設實現,那麼使用抽象類吧。
- 如果你想實現多重繼承,那麼你必須使用介面。由於Java不支援多繼承,子類不能夠繼承多個類,但可以實現多個介面。因此你就可以使用介面來解決它。
- 如果基本功能在不斷改變,那麼就需要使用抽象類。如果不斷改變基本功能並且使用介面,那麼就需要改變所有實現了該介面的類。
- 當extends和implement同時使用時,extends要放在前面。
Java8中的預設方法和靜態方法
Oracle已經開始嘗試向介面中引入普通方法和靜態方法(static),以此來減少抽象類和介面之間的差異。現在,我們可以為介面提供預設實現的方法了並且不用強制子類來實現它。
jdk1.8 允許在接口裡面定義普通方法,但普通方法必須使用default修飾。