[和管子對話] 2 2007-4-6/抽象類和接口的誰是誰非
發布日期:2007.4.6 作者:Anytao
?2007 Anytao.com 轉貼請注明出處,留此信息。
本文將介紹以下內容:
? .NET的基礎和技巧探討
? 胡言亂語話技術
王論:
今日話題:《抽象類和接口的異同》
管語:
呵呵!好!
先說一下抽象類:
抽象類是聲明方法的存在而不去實現它,這樣的類就是抽象類,它用于要創建一個體現某些基本行為的類,并為該類聲明方法,但不能在該類中實現方法,這和接口一致。不能創建abstract 類的實例。然而可以創建一個變量,其類型是一個抽象類,并讓它指向具體子類的一個實例。不能有抽象構造函數或抽象靜態方法。Abstract 類的子類為它們父類中的所有抽象方法提供實現,否則它們也是抽象類。取而代之,在子類中實現該方法。就是說知道其行為的子類或其他類可以在類中實現這些方法。
在java中,抽象類中可以沒有抽象方法
如果一個類中有抽象方法,那么這個類必須定義為抽象類
王論:
我來說接口:
接口在某種程度上和抽象類是一樣的,例如都是提供了聲明而沒有實現,必須由集成的類實現所有定義的接口方法,否則不能編譯。
上述你所說的關于Java中抽象類的規則,基本和.NET差不多。
管語:
java中:
接口是抽象類的變體。在接口中,所有方法隱含著都是抽象的。多繼承性可通過實現這樣的接口而獲得。因為接口中的所有方法都是抽象的,所以沒有一個有程序體。接口可以定義static final成員變量,我認為這是一個抽象類不同的地方,接口的實現與子類相似,但是這個實現類不能從接口定義中繼承行為。這也是和普通類繼承機制不同的地方。當類實現特殊接口時,它定義必須所有這種接口的方法。然后,它可以在實現了該接口的類的任何對象上調用接口的方法。由于有抽象類,它允許使用接口名作為引用變量的類型。instanceof 運算符可以用來決定某對象的類是否實現了接口。
抽象類中,究竟可不可以實現一個方法?我剛才是不是說錯了?
王論:
剛才講了相同點,現在說說不同處:
抽象類:可以包括抽象方法,也可以提供非抽象方法,也就是說,抽象類中可以有實現的方法,這些方法可以提供公共的規則定義。
接口:只能提供沒有實現的抽象方法,在接口中,所有的方法都默認為public,因此,接口中不能有private修飾符。
抽象類:只能單繼承;
接口:可以多繼承。
管語:
其實就是應該多說說他們的不同點
王論:
是啊,另外你剛才說的instanceof操作符號,是用來判斷接口類型,還是其他類型都可以判斷:
在C#中有一個is操作符是可以判斷所有類型的。例如:
interface IAnytao2
{} 3

4
class Test5
{6
IAnytao tao = new Anytao();7
if (tao is IAnytao) 8
{9
Console.Write("tao is a instance of IAnytao.");10
}11
}12

管語:
intanceof和is是一個意思!
王論:
另外,C#中還有as操作符,Java中有對應的嗎?
管語:
as是干嗎的?
王論:
和is差不多,不過更常用,效率更高
管語:
區別:
1、接口可以被多重implements,抽象類只能被單一extends
2、接口只有定義,抽象類可以有定義和實現
3、接口的字段定義默認為:public static final,抽象類字段默認是友元的,就是“friend”(本包可見)
4、抽象類是一個不完整的類,需要進一步細化,而接口是一個行為的規范。
5、接口基本不具備繼承的任何基本特點,它只是承諾了能夠調用的方法。
6、一個類一次可以實現多個接口,但是只能繼承一個父類。
7、接口可以用于支持回調(callback),但是繼承不行。用于回調的接口只是提供指向方法的指針,而且是一個類型安全的“指針方式”。
?2007 Anytao.com 轉貼請注明出處,留此信息。
本貼子以“現狀”提供且沒有任何擔保,同時也沒有授予任何權利。
This posting is provided "AS IS" with no warranties, and confers no rights.
Worktile,新一代簡單好用、體驗極致的團隊協同、項目管理工具,讓你和你的團隊隨時隨地一起工作。完全免費,現在就去了解一下吧。
https://worktile.com




浙公網安備 33010602011771號