舉例說明你什麼時候會用抽象類,什麼時候更願意使用介面?

眼鏡333發表於2018-01-12
介面和抽象類都按照“不為實現寫程式碼”的設計原則,這是為了增加程式碼的靈活性,以應付不斷變化的要求。
在Java中,你只能繼承一個類,但實現多個介面。所以你繼承一個類的時候就無法再繼承別的類了。
介面是用來代表形容詞或行為,例如Runnable、Clonable、Serializable等。因此,如果您使用一個抽象類來定義(實現)Runnable和Clonacle,你就不可以使你的類同時實現這

兩個功能,而如果介面的話就沒問題。
抽象類是比介面稍快,所以很在乎時間的應用盡量使用抽象類。
如果多個繼承層次的共同行為在同一個地方編寫更好,那麼抽象類會是更好的選擇。有時候可以在介面裡定義函式但是在抽象類裡預設功能就能實現介面和抽象類共同工作了。
用Java設計一個併發規則管道?
併發程式設計和並行設計非常熱門,因為它能更高效地利用現在越來越先進的處理器,而且Java被認為是多執行緒語言也主要因為此原因。設計一個併發系統的關鍵在於執行緒安全、不可變

性、本地變數,還有避免使用區域性變數和例項變數。你只需要保證多個執行緒能夠在同一時間執行同一個類,所以最佳解決方案就是每個執行緒只操作自己的資料,儘量使用最小的同步

,尤其是在管道開始時。這個問題可以從初始討論到最終類和介面的編寫實現,但是隻要你記得注意併發問題的關鍵,比如競爭狀態、死鎖、記憶體衝突、原子操作、ThreadLocal變

量等等,儘量繞過這些問題。
       1.abstract class 在 Java 語言中表示的是一種繼承關係,一個類只能使用一次繼承關係。但是,一個類卻可以實現多個interface。

  2.在abstract class 中可以有自己的資料成員,也可以有非abstarct的成員方法,而在interface中,只能夠有靜態的不能被修改的資料成員(也就是必須是 static final的,不過

在 interface中一般不定義資料成員),所有的成員方法都是abstract的。

  3.abstract class和interface所反映出的設計理念不同。其實abstract class表示的是"is-a"關係,interface表示的是"like-a"關係。

  4.實現抽象類和介面的類必須實現其中的所有方法。抽象類中可以有非抽象方法。介面中則不能有實現方法。

  5.介面中定義的變數預設是public static final 型,且必須給其初值,所以實現類中不能重新定義,也不能改變其值。

  6.抽象類中的變數預設是 friendly 型,其值可以在子類中重新定義,也可以重新賦值。

  7.介面中的方法預設都是 public,abstract 型別的。
   
super和this的區別+介面和抽象類的區別 :
  1.super可以理解成是指向父類物件的引用,可以在子類裡,使用super呼叫父類裡被覆蓋掉的方
  法或者變數。this可以理解為指向自身物件的引用,可以呼叫同一個類中的方法或變數。
2.靜態變數和靜態方法都是屬於類的,也就是說,可以不用new一個物件,而直接用類來呼叫,
  靜態變數在記憶體中只有一份拷貝,類的所有例項共享靜態變數。
3.繼承使用extends關鍵字實現,eg: class Dog extends Animal{}。
4.介面和抽象類的區別:
  1.介面體現的是一種規範,抽象類體現的是模板式設計。
  2.介面裡的方法全部是抽象方法,抽象類裡可以有方法實現。
  3.介面裡不可以定義靜態方法,抽象類裡可以。
  4.介面裡的變數全部為靜態常量,抽象類裡可以有普通變數。
  5.介面裡不可以有建構函式和初始化塊,抽象類裡可以有。
  6.一個類可以實現多個介面,但只能繼承一個抽象類。

“介面是完全抽象的成員集合,它的成員都無法在介面定義時實現,我們可以將它看作是為操作定義合同,介面的實現完全留給開發者去做。它們之間的區別,如果認真分析,還是

有不少的:在JAVA中,類只能是從一個基類繼承,所以如果要使用抽象類為一組類提供多型性,這些類必須都是從那個類繼承的;介面就不一樣了,它不但可以用一個類或結構實

現多個介面,一個介面還可以有多個實現。”

抽象類是一種不能例項化而必須從中繼承的類。抽象類可以完全實現,但更常見的是部分實現或者根本不實現,從而封裝繼承類的通用功能,它可以提供已實現的成員,因此,可以

用抽象類確保特定數量的相同功能,但不能用介面這樣做。
“也就是說,它們在提供多型性的問題上是有差別的

有個通用的設計思想,如果要設計小而簡練的功能塊,則使用介面。如果要設計大的功能單元,則使用抽象類。”

如果使用適當,介面可以成為很有用的工具。但如果使用不當,它們會變得非常棘手,甚至妨礙有效的程式設計。介面的設計與使用其實是一項高明的藝術。”

“通過介面與實現的方式,我們可以將同一型別的程式運用在不同的物件上面,而且不必修改原有類,相對子程式必須通過修改源程式程式碼才能夠達到重用的目的,介面與實現不僅

是偉大的進步,也是境界極高的程式設計藝術。” 

   介面是一種非常有效的程式設計方法,它讓物件的定義與實現分離,從而可以在不破壞現有應用程式的情況下使物件得以完善與進化。介面消除了實現繼承的一個大問題,就是在對設

計實施後再對其進行更改時很可能對程式碼產生破壞。即使實現繼承允許類從基類繼承實現,在類首次釋出時仍然會使我們不得不為設計做很多的抉擇。如果原有的設想不正確,並非

總可以在以後的版本中對程式碼進行安全的更改。比如,我們定義了一個基類的方法,它需要一個 Integer 引數,而後來又確定該引數應該為 Long 資料型別。我們無法安全更改原始

類,因為為從原始類派生的類所設計的應用程式可能無法進行正確編譯。這一問題會擴大化,因為單個基類會影響幾百個子類。”

   在應用程式要求很多可能不相關的物件型別以提供某種功能的情況下,用介面適用性會更強;介面比基類更靈活,因為可以定義單個實現來實現多個介面;在無需從基類繼承實現

的情況下,介面更好;在無法使用類繼承的情況下介面是很有用的。例如,結構無法從類繼承,但它們可以實現介面。”

“但是,最大的問題還是集中在介面設計上。介面一旦被定義和接受,就必須保持不變,以保護為使用該介面而編寫的應用程式。介面釋出後,就不能對其進行更改。這是我們進行

元件設計的一個重要原則,叫做‘介面不變性’。”
   建立一個介面就是在建立一個定義,介面定義釋出後則永遠不能更改。介面不變性,就是為了保護為使用介面而編寫的現有系統。當介面設計與需求有所出入,確認需要大幅度變

更時,我們應該建立新的介面。
  

相關文章