Java新手問題 02 面向對象基本功

Question: 基於接口的繼承和基於實現的繼承各有什麼優缺點

接口的本質:

  • 協議,約定,能力. 接口這個概念在生活中並不陌生,電子世界中一個常見的接口就是USB接口。電腦每每有多個USB接口,能夠插各類USB設備,能夠是鍵盤、鼠標、U盤、攝像頭、手機等等。接口聲明瞭一組能力,但它本身並無實現這個能力,它只是一個約定,它涉及交互兩方對象,一方須要實現這個接口,另外一方使用這個接口,但雙方對象並不直接互相依賴,它們只是經過-接口間接交互

實現的本質:

  • 事物自己要作的具體功能,具體操做

繼承的本質:

  • 對具體功能的擴展,泛化
  • 之因此叫繼承是由於,子類繼承了父類的屬性和行爲,父類有的屬性和行爲,子類都有。但子類能夠增長子類特有的屬性和行爲,某些父類有的行爲,子類的實現方式可能與父類也不徹底同樣。使用繼承一方面能夠複用代碼,公共的屬性和行爲能夠放到父-類中,而子類只須要關注子類特有的就能夠了,另外一方面,不一樣子類的對象能夠更爲方便的被統一處理。

基於接口的繼承:

  • 優勢:
    • 擴展靈活,表明協議層面的擴充. 能夠在原接口上提供能力的擴展.
    • 接口的繼承在下降耦合度方面有很好的做用,接口的繼承不像實現的繼承那樣破壞封裝.
  • 缺點:
    • 只是針對接口能力的擴展, 沒有具體實現代碼的複用. 具體可複用實現須要具體處理.

基於實現的繼承:

  • 對原有實現的擴展,能夠是父類的不一樣實現子類html

  • 優勢:
    • 子類能夠複用父類代碼,不寫任何代碼便可具有父類的屬性和功能,而只須要增長特有的屬性和行爲。
    • 子類能夠重寫父類行爲,還能夠經過多態實現統一處理。
    • 給父類增長屬性和行爲,就能夠自動給全部子類增長屬性和行爲。
    • 另外一個是利用多態和動態綁定統一處理多種不一樣子類的對象
  • 缺點:
    • 破壞類封裝,子類的的代碼和父類耦合,若是子類不知道基類方法的實現細節,它就不能正確的進行擴展。
    • 下降代碼靈活性,子類必需要有父類的的全部public方法,子類再也不自由.
    • 侵入性,必需要有父類的全部方法

Question: 繼承(包括 extend 和 implement)有什麼【缺點】

  • extends 是繼承一個具體實體類
  • implements 是繼承一個接口.
    • 缺點:
      • 子類會依賴於父類存在沒法解耦,父類的更改會影響子類
        • 父類新增方法
        • 父類刪除方法
        • 子類脫離父類沒法獨立存在
      • 性能上會有影響,若是有十層繼承,那麼執行一個方法須要尋找十層
    • 優勢:
      • 增長代碼複用,重複的代碼能夠在父類中定義,子類能夠很便利的調用
      • 覆蓋,子類能夠重寫父類的實現
      • 擴展性,子類能夠增長本身的實現
      • 接口會使得程序變得更加靈活
      • 隱藏數據,父類能夠定義一些屬性爲private,這樣子類就須要重定義

Question: 多態(polymorphism)有什麼【缺點】?

  • 性能問題(這個比較輕微);
  • 好比在「實現繼承」中的多態,可能會附帶有繼承的缺點。

Question: 爲何 Java 能夠多繼承 interface,而不能夠多繼承 class?

  • 菱形繼承問題,若果a,b都有一個add方法.c多繼承a,b; 那麼c沒法肯定該用哪一個父類的add方法.除了方法,變量也有這類問題.

Question: 假如讓你寫一個小遊戲(好比人機對戰的五子棋),你會如何設計類結構?

  • 棋盤(放置棋子接口/獲取當前棋盤狀況接口/和棋計算)
    • 虛擬棋盤
      • 棋位置的二維數組
  • 棋子
    • 白棋子
    • 黑棋子
  • 棋手(下棋接口)
    • 電腦
    • 人類

Question: 類結構設計時,如何考慮可擴展性?

我認爲作到以下幾點就能夠保證擴展性了.java

  • 單一職責原則:
    Single Responsibility Principle
  • 里氏替換原則:
    If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T,the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T.(若是對每個類型爲S的對象o1,都有類型爲T的對象o2,使得以T定義的全部程序P在全部的對象o1都代換成o2時,程序P的行爲沒有發生變化,那麼類型S是類型T的子類型。)
  • 依賴倒置原則:
    Dependence Inversion Principle.High level modules should not depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details.Details should depend upon abstractions.
  • 接口隔離原則:
    Clients should not be forced to depend upon interfaces that they don't use; The dependency of one class to another one should depend on the smallest possible interface.
  • 迪米特法則:
    Least Knowledge Principle
  • 開閉原則:
    Software entities like classes, modules and functions should be open for extension but closed for modifications.

參考網址

相關文章
相關標籤/搜索