直面Java 第001期java
面向過程是以函數爲中心,要解決一個問題,須要把問題分解爲一個個的步驟,而後定義一系列的流程,用特定的輸入通過函數的處理,最終輸出特定的結果。函數
面向對象是對象爲中心,對每個步驟抽象造成對象,在對象中封裝好須要解決問題的方法,強調了代碼的複用。code
好比說如今要實現一個開車的功能。對象
對於面向過程來講,實現駕駛員開車,須要定義一系列的流程,好比說掛擋 -> 踩離合 -> 踩油門等等,此外若是如今有一個其餘的車,就須要從新定義一下流程。blog
對於面向對象來講,實現這個功能,能夠先定義一個基本的車類型,封裝一些共有的屬性和方法,而後定義一個特定的車類型,在其中定義駕駛這個車須要的方法,之後要用的時候直接調用這個對象的方法就能夠了,若是有其餘的車須要駕駛,也能夠經過繼承來公用一些都有的屬性方法,增長了代碼的複用性。繼承
就是把一個對象所擁有的屬性和方法融合進一個結構中,對外只顯示定義者想給外界看的東西。接口
對於屬性,好比說一個車,可能會有大小,材質,顏色等屬性,通常不直接對外公開,提供一個方法來決定給外界什麼的屬性操做權限。get
對於方法,好比說車中會有前進、後退、轉彎等方法,通常是用來定義這個對象的一些操做行爲,提供給外界使用。class
經過A類繼承來繼承B類,使得A類來重用一些B類的屬性和方法。擴展
例如一開始定義了一個車子類型,裏面有全部車子都有的顏色,材質等屬性,前進、後退等行爲,如今有一個私家車類型,只要繼承了前面的車類型,就已經擁有了父類所定義的這些,還能夠重載來使得其變得擁有自身的屬性方法。
多態通常經過類繼承和接口實現指向子類來實現,使得經過父類引用來操做子類對象。
# 這樣就能夠用父類的引用來調用子類 Vehicle vehicle = new Vehicle(); vehicle.move();
一個類應該有且只有一個去改變它的理由
好比說求一個圖形的面積並返回給用戶,這個方法須要定義如何求面積和如何返回的話,就違反了「單一職責原則」,往後若是返回格式變了,就須要從新定義方法,就違背了原則.所以咱們只須要定義求面積,具體如何返回,交給其餘的方法來操做.
對象或實體應該對擴展開放,對修改封閉。
對於求一個圖形的面積,若是咱們已經定義好了,此時須要求其餘的圖形,不能在原先定義的方法裏面修改,應該拓展一個其餘方法來求解.
對父類的調用一樣適用於子類
子類應當能夠替換父類並出如今父類可以出現的任何地方.由於父類擁有的東西子類都有,所以能夠替換。
不該強迫客戶端實現一個它用不上的接口,或是說客戶端不該該被迫依賴它們不使用的方法
對於一個立體圖形來講,擁有求體積的的功能,如今有一個平面圖像,就不能實現這個接口,由於平面圖形不求體積。
高層次模塊不該依賴於低層次模塊。
應該把低層次模塊中的特定功能抽象成接口,而後實現這個接口,這樣高層模塊就能夠調用接口來實現解耦,往後低層次模塊修改了,高層次模塊不用改變。
參考資料: