天天看點

Java中接口和抽象類的相似點與差別(面試會問)

推理題庫 推理 偵探推理題及答案 http://tuiliti.cn

推理題庫 TuiLiTi.cn

它們十分相像,都有如下特征:

  • 都不能被執行個體化,都位于繼承樹頂端,用于被調用和繼承。
  • 都包含抽象方法,實作接口或者繼承抽象類的子類都必須實作(也就是重寫)這些抽象方法。

但接口和抽象類的差别非常大,接口展現的是一種規範,對于接口的實作者而言,接口規定了實作者必須向外界提供哪些服務(也就是抽象接口中給出的方法);對于接口的調用者而言,接口規定了可以調用哪些服務,以及如何調用這些服務。當在一個程式中使用接口時,接口是多個子產品間的耦合标準;當在多個程式中使用接口時,接口是多個程式間的通信标準。

是以,接口不應該經常改變,否則系統中大部分類也需要改變。

抽象類則不一樣,作為多個子類共同的父類,抽象類展現的是一種模闆式設計。抽象類作為多個子類的抽象父類,可以被當成系統實作過程中的中間産品,它已經實作了系統需要實作的某些功能,但是仍然不太完善。完善的方法有很多種。

除此之外,接口和抽象類在用法上也存在以下差别:

  • 接口隻能包含抽象方法、靜态方法和預設方法,不能作為普通方法提供方法實作;而抽象類則完全可以包含普通方法。
  • 接口裡隻能定義靜态常量,不能定義普通成員變量;抽象類裡則既可以定義普通成員變量,又可以定義靜态常量。
  • 接口不包含構造器;抽象類則可以包含構造器,抽象類裡的構造器并不用于構造對象,而是讓其子類調用,進而完成抽象類的初始化操作。
  • 接口不能包含初始化塊,而抽象類可以。
  • 一個類最多隻能有一個直接父類,包括抽象類;但是卻可以實作多個接口。多接口實作可以彌補單繼承機制的不足
  • 子類和抽象類是從屬關系(IS-A),而接口是組合、調用的關系。(這也是為什麼大多數調用都需要--able的接口)

繼續閱讀