《JAVA編程思想》5分鐘速成:第9章(接口)

第9章 接口

9.1 C++的抽象設計 :

在C++中,只有抽象類的概念(沒有abstract關鍵字),沒有接口的說法。

虛函數:

C++通過virtual關鍵字將類內方法聲明為虛函數(如virtual void f();)來實現多態(在C++中,派生類只能重寫父類的虛函數,而在Java中,除static方法外,其它方法都是可以被重寫的,即默認都是多態的)。除此以外,包含虛函數的類與其它類沒有區別。

純虛函數:

對虛函數如virtual void f() = 0;聲明時,構成純虛函數。因為純虛函數沒有函數體,不是完整的函數,無法調用,也無法為其分配內存空間,無法實例化,也就無法創建對象,所以在C++中含有純虛函數的類被稱為抽象類(Abstract Class,注意在C++中,沒有abstract關鍵字)。抽象類通常作為基類(叫做抽象基類),讓派生類去實現純虛函數。派生類必須實現純虛函數才能被實例化。


9.2 Java的抽象設計 :

在Java中,有abstract 和 interface 關鍵字,通過它們來定義抽象類和接口;


9.2.1 Java的抽象類&抽象方法(abstract關鍵字) :

抽象類不能實例化,即不能通過new生成對象,但注意可以追加{}生成匿名實現類,仍然不是它自己的實例化。

抽象類可以有構造函數,但不能直接調用,通常由實現類構造函數調用。

抽象類的方法前添加abstract關鍵字,定義抽象方法,相當於C++的純虛函數,派生類必須重寫該方法,然後才能實例化。Java類中如有抽象方法,則類符號前必須也要添加abstract關鍵字,定義為抽象類(可以沒有抽象方法)。

抽象類中可以沒有抽象方法,即可以全部是含方法體的非抽象方法。


9.2.2 Java的接口 (interface關鍵字):

抽象類進一步抽象,即所有方法都沒有具體實現,只聲明瞭方法的形式(同C++頭文件中函數的聲明格式),並且把class關鍵字改成interface關鍵字,這就創建了一個接口。

接口可以包含域,且隱式地是static 和 final的,顯然,接口中的域不能是空final,這些域不是接口的一部分,它們存儲在該 接口的靜態存儲區域內。

接口關鍵字interface前可以添加public修飾符,不加默認是包訪問權限,接口的方法默認都是public的。


9.3 Java的多重繼承實現:

因為Java接口沒有任何具體實現,即沒有任何與接口相關的存儲,因此可以定義一個Java類來implements多個接口,達到C++中多重繼承的效果。

Java可以定義一個接口去extends另外的一個或多個接口來實現接口的擴展。

因為Java接口中的域自動是final和static的,所以接口就成了一種便捷的創建常量組的工具。在Java SE5之前,用這種方式來產生enum的效果。Java SE5之後,Java有了enum關鍵字,因此使用接口來群組常量就沒意義了。


9.4 Java的接口多層嵌套:

Java允許多層接口嵌套。


9.5 接口與工廠方法:

生成遵循接口規範的對象的實現方式:

public Iservice create(){

return new ServiceImpl1(); // or new ServiceImpl2();

}

a. 特徵1:方法返回類型定義:接口Iservice

b. 特徵2:返回值對象為implement接口的類對象:實例ServiceImpl


《JAVA編程思想》5分鐘速成:第9章(接口)


分享到:


相關文章: