第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
閱讀更多 編程家園 的文章