談談面向物件的三大特性
本文閱讀時間大約需要5分鐘。
參考答案
封裝:常見的程式設計正規化有:程序式程式設計、面向物件程式設計、函數語言程式設計,現在函數語言程式設計很火,但是面向物件程式設計依然是主流。
-
在Java中,封裝是一種抽象機制,Java中提供了類和物件的概念,物件包含了一組資料和行為,並且可以響應對應的請求,這樣的機制有助於開發者面向具體的領域問題程式設計,而不是像之前過程式語言中一樣,就按照一步步的步驟來處理一些資料。在這裡並不是說之前的語言不夠好,而是說應用成本的問題,C語言不支援面向物件,但是也產生了unix、linux這樣偉大的軟體,但其實程式設計思想是相通的,在linux核心中有很多地方都用到了面向物件的程式設計思想,只是實現起來有一定的難度和門檻,而Java提供的抽象機制降低了這個門檻。
-
封裝的本質是資訊隱藏,資訊隱藏的初衷是為了將容易改變的程式碼和不經常改變的程式碼隔離開,以便控制程式碼變更的影響面。
繼承:繼承的目的是為了程式碼複用。有了封裝,有了類和物件這種機制,可以將一些資料和行為封裝再一個類裡,但是還有問題沒解決:如果有幾個類有類似或共同的行為,就需要做很多重複性的工作。為了解決這個問題,Java提出了繼承的概念。
-
當繼承一個現有型別時,就產生了新的型別,這個新的型別不僅包括父類的所有成員,更重要的是它複製了基類的介面;子型別的物件可以被父類型別的變數引用,反之則不行。
-
有兩種方法可以讓子類和父類產生差異:直接在子類種新增新的方法和成員變數;改變現有父類的行為,在Java種的術語叫做覆蓋(overriding)。
多型:多型的提出是為了將解決方案和邏輯複用,實現良好的可擴充套件性 。
-
Java中的多型是依靠介面實現的,定義一個介面,面向介面程式設計 ,具體的實現類可以有多個,後面再增加新的實現類的時候,不會對使用這個介面的業務邏輯產生影響。最經典的例子就是繪圖例子:定義一個generic介面,編寫的方法操作的都是泛化的型別而不是具體的型別,這樣後面再加入新的型別的時候原有業務邏輯不需要改變。
-
Java中的多型的實現是執行時繫結 ——編譯器無法直到會執行哪一個實現類的程式碼,編譯器會產生對一個具體函式的名字的呼叫,在執行時再將這個呼叫解析為具體程式碼的地址。
參考答案
面向物件理論的三個基本概念:封裝、繼承、多型的知識點在上面已經梳理過了,這裡給出在OOP方面急需深入的建議。面向物件是一種很好的程式設計正規化,不過我們不能手裡拿著錘子就看到啥都是釘子,還需要擴充套件下自己的視野。這幾年非常火的函數語言程式設計正規化,就是一種值得學習的程式設計正規化,他跟面向物件不同,賣點在於:函式作為一等公民,函式的呼叫沒有副作用。
再回到面向物件的學習,OOP學完,就可以學習OOD,然後要多做專案,專案做得多了以後,就有機會沉澱出很多經驗和固定的套路,這就是設計模式,也值得學習。
基本理論、設計模式都準備好後,應付初級的Java面試就沒問題了,不過我們這裡還可以再擴充套件下。設計模式是針對程式碼級別的套路總結,如果把場景擴大到架構層面,就需要看架構模式了,之前有寫過一篇文章總結了常見的架構模式。最後要注意,空學理論沒什麼用,一定要在專案中應用,否則就是過個眼癮,沒啥價值。
架構模式、設計模式都屬於技術範疇,如果要應對更復雜的業務場景,只是基本的OOP和OOD是不夠用的,這時候就需要用到DDD(領域驅動設計),領域驅動設計就是為了解決複雜常見而生的。當然,場景可能更加複雜,例如我們要做平臺化,那麼就需要做進一步的抽象,也就是所謂的領域的領域,這塊就比較深了,是我努力的方向。
你再主動一點點 我們就有故事了