07 接口和抽象類

接口

比抽象類更加抽象的是接口,在接口中所有的方法都會被 public abstract 修飾。

注意:Java 8 之后接口中新增加了 default 默認方法和 對 static 方法的支持。

  • Java 中不支持多繼承,而是通過接口實現比多重繼承更強的功能,java 通過接口可以使出于不同層次,甚至不相關的類具有相同的行為.
  • 接口可以認為是特殊的抽象類, 不能用于直接創建對象。接口的作用在于規定一些功能框架,具體功能的實現則通過該接口約束的類完成。

接口的定義:一般由常量和抽象方法組成

[public] interface 接口名 [extends 父接口名列表 ]  {                 
    [public] [static] [final] 域類型 域名 = 常量值 ;                 
    [public] [abstract] 返回值 方法名(參數列表) [throw 異常列表];           
 }
  1. 聲明接口可給出訪問控制符;
  2. 接口的繼承同樣使用 extends 關鍵字,多個父接口之間以逗號分隔。
  3. 系統默認接口中所有屬性的修飾都是 public static final, 為全局常量.
  4. 系統默認接口中所有方法的修飾都是 public abstract; 即抽象方法.
  5. 與類一樣,接口也可以使用 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 抽象類。

參考

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 先來看看抽象類和接口的定義: 抽象類(abstract class): 使用abstract修飾符修飾的類。官方點...
    IT廢柴閱讀 53,934評論 7 45
  • Java中,有兩種實現OOP(Object Oriented Programming)編程的方法:抽象,接口。 f...
    Arya鑫閱讀 507評論 0 1
  • 1)抽象類與接口的問題,面了好幾個公司,都會被問到,其實這也是開發過程中經常遇到的問題,在這里所說的接口是指jdk...
    Hughman閱讀 1,252評論 0 2
  • 安靜下來,聽著舒緩的音樂,我沉默了一會才動筆,想給你們介紹一位傳奇,一位女王,一個奇跡。 我是一個,專業院校畢業的...
    瘦成閃電的辣媽閱讀 2,644評論 3 12
  • 薔薇最初玩畫的線條!!!
    紫薔薇簡書閱讀 351評論 0 1