接口
比抽象類更加抽象的是接口,在接口中所有的方法都會被 public
abstract
修飾。
注意:Java 8 之后接口中新增加了 default 默認方法和 對 static 方法的支持。
- Java 中不支持多繼承,而是通過接口實現比多重繼承更強的功能,java 通過接口可以使出于不同層次,甚至不相關的類具有相同的行為.
- 接口可以認為是特殊的抽象類, 不能用于直接創建對象。接口的作用在于規定一些功能框架,具體功能的實現則通過該接口約束的類完成。
接口的定義:一般由常量和抽象方法組成
[public] interface 接口名 [extends 父接口名列表 ] {
[public] [static] [final] 域類型 域名 = 常量值 ;
[public] [abstract] 返回值 方法名(參數列表) [throw 異常列表];
}
- 聲明接口可給出訪問控制符;
- 接口的繼承同樣使用 extends 關鍵字,多個父接口之間以逗號分隔。
- 系統默認接口中所有屬性的修飾都是 public static final, 為全局常量.
- 系統默認接口中所有方法的修飾都是 public abstract; 即抽象方法.
- 與類一樣,接口也可以使用 instanceof 關鍵字,用來判斷一個對象是否實現了某接口。
接口的實現
- 定義了一套行為規范,一個類實現這個接口就是要遵守接口的定義規范,要實現接口中定義的所有方法.
- 一個類可以實現多個接口。接口間用逗號分隔;
- 如果實現某接口的類不是抽象類,則在類的定義部分必須實現指定接口的所有抽象方法;否則編譯時會指示該類只能為抽象類是不能創建對象的.
- 接口的抽象方法的訪問限制符默認為 public
Java 8 新特性默認方法和靜態方法
Java 8在接口中提供了聲明默認方法和靜態方法的能力。接口示例代碼如下:
package xxx.yyy;
public interface IHello {
public static void xxx() {
System.out.println("xxx");
}
public default void yyy() {
System.out.println("yyy");
}
}
注意:在 Java 8 中,靜態方法和默認方法都必須是 public 的,Java 9 去除了這個限制,它們都可以是private的,引入 private方法主要是為了方便多個靜態或默認方法復用代碼。
抽象類
引入抽象方法和抽象類,是 Java 提供的一種語法工具,對于一些類和方法,引導使用者正確使用它們,減少誤用。使用抽象方法而非空方法體,子類就知道它必須要實現該方法,而不可能忽略,若忽略Java編譯器會提示錯誤。使用抽象類,類的使用者創建對象的時候,就知道必須要使用某個具體子類,而不可能誤用不完整的父類。
抽象類聲明和實現
在Java中抽象類和抽象方法的修飾符是 abstract
,注意抽象方法中只有方法的聲明,沒有方法的實現。
- 抽象類不能被實例化,只有具體類才能被實例化;
- 抽象類可以擁有默認的構造函數, 供子類實例化調用, 用于完成子類構建對象的一些公共任務;
- 抽象類中可以包含具體方法和抽象方法;
- 非抽象類(具體類) 若繼承抽象類必須重寫所有抽象方法。
abstract class 類名稱 {
member var;
method(){…} // 一般方法
abstract method(); // 抽象方法, 抽象方法在后直接跟分號
}
普通類加上 abstract 關鍵字就變成了抽象類。一但類中包含有抽象方法的類必須定義為抽象類或者接口,否則編譯時會提示 The type XXX must be an abstract class to define abstract methods
Q: 抽象關鍵字 abstract 不可以和哪些關鍵字共存?
A: private
私有內容子類繼承不到,所以,不能重寫. 但是,abstract修飾的方法,要求被重寫。兩者沖突。
final
final 修飾的方法不能被重寫。而 abstract 修飾的方法,要求被重寫。兩者沖突。
static
假如一個抽象方法能通過 static 修飾,那么這個方法,就可以直接通過類名調用。而抽象方法是沒有方法體的,這樣的調用無意義。所以,不能用 static 修飾。
抽象類和接口是配合而非替代關系,它們經常一起使用,接口聲明能力,抽象類提供默認實現,實現全部或部分方法,一個接口經常有一個對應的抽象類。比如,在 Java 類庫中,有:
? Collection 接口和對應的 AbstractCollection 抽象類。
? List 接口和對應的 AbstractList 抽象類。
? Map 接口和對應的 AbstractMap 抽象類。
參考
- 丁振凡編著,《Java 語言程序設計(第2版)》華東交大版,2014.9
- Java 編程的邏輯-微信讀書
https://weread.qq.com/web/reader/b51320f05e159eb51b29226kc81322c012c81e728d9d180