Java中的抽象(Abstract)學習總結

抽象Abstract:在Java程序設計中,利用Abstract關鍵字來進行抽象,抽象的目的或者說好處,是1.把對象的共性抽取出來,使得代碼編寫簡潔,容易維護。2.定義一系列規範(方法),繼承抽象類的實體類必須滿足這些規範(實現抽象方法),這是複雜系統的基礎。3.好的抽象應該就是現實世界的反映,把共性封裝成抽象類,但又不存在於現實世界所以不可能實例化。

抽象的實現是通過Abstract修飾抽象類,Abstract修飾方法,或者通過接口來實現。一般都可以認爲接口也是一種抽象,只是在使用規則,編程思想上有一些區別,但是他們的目的都是一樣的。

  1. abstract Class表示一個類是抽象類,抽象類是不能被實例化的。抽象類裏可以只有抽象方法,也可以只有具體方法,或兩者兼有。
  2. abstract修飾方法表示一個無實現邏輯的方法。這個就是定義的一個規範,是等着繼承類去實現的。
  3. 接口是一種特殊的抽象類,abstract關鍵字對接口和接口內的方法都是默認存在的(即abstract interface 和interface完全等價)。接口裏不能有具體方法。

通過上述三者實現了抽象體系,達到抽象的目的。抽象的使用隨處可見,可以分析java.util包,對集合類使用的抽象是很好的例子。


下面列出抽象必須弄清楚的問題:

  1. 抽象方法不可脫離抽象類,或者說,有抽象方法則一個類自動成爲抽象類。繼承一個抽象類卻只部分實現其中的抽象方法,那麼這個類也只能還是一個抽象類,直至全部實現。
    反之一個抽象類卻可以沒有抽象方法,你或許奇怪那這是抽的什麼象呢?這種用法還是存在的,其目的是不希望這個類被實例化。這種形式在Spring源碼中實現單例模式就用到了。
  2. 抽象類也可以繼承實體類,也可以實現接口,沒有什麼特別的限制。
  3. 抽象方法,接口裏的方法,必須被重寫實現,所以必須是public的。接口裏可以有成員變量,但是必須(默認)是public static final的。
  4. 我們會在抽象類的非抽象方法中看到this。this代表的是對象本身,是和實例化有關的。如果抽象類不能被實例化,那麼方法中的this是指什麼呢?static方法,抽象方法中肯定不能有this,所以普通方法中的this肯定是由實例化對象調用的,所以這裏的this,就是繼承抽象類的實體類本身。 ps:實際上在普通類之間的繼承,子類調用父類方法時碰到this也是指之類本身。
  5. 抽象類可以是static的(內部類才能使用static),但是抽象方法卻不能是static的,因爲抽象方法就是爲了重寫。

我們在什麼時候使用抽象類,什麼時候使用接口呢?並沒有嚴格的語法規範,根據實際經驗來選擇。從編程思想上說,結合現實世界,抽象類表明子類和其是一脈相承的,is-a的關係。而接口是表明實現類持有接口的某項功能,has-a的關係。


附帶再列出類和接口的一些相互關係,不管是抽象還是實體類都遵從下面的法則:

  1. 接口只能繼承(extends)接口,還可以繼承多個接口,用逗號分隔。接口不能繼承類。
  2. 類只能實現(implements)接口,可以實現多個接口。類可以繼承類,只能繼承一個類。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章