面向對象 問題 面向對象的好處 學一門技術是否需要趣味性、通俗性的指導 面向對象 什麼是對象 世間任何事物都可以定義為對象。 什麼是類 類就是把對象的公共屬性和方法抽離出來形成集合的抽象,也就是說,類是一種抽象,用來描述對象特征的抽象。 什麼是實例 實例就是對象,就好比我們,就是人這種抽象的一個實例 ...
面向對象
問題
- 面向對象的好處
- 學一門技術是否需要趣味性、通俗性的指導
面向對象
什麼是對象
世間任何事物都可以定義為對象。
什麼是類
類就是把對象的公共屬性和方法抽離出來形成集合的抽象,也就是說,類是一種抽象,用來描述對象特征的抽象。
什麼是實例
實例就是對象,就好比我們,就是人這種抽象的一個實例。
什麼是構造方法
從字面上來看,構造方法是用來構造對象,當對象正在創建時,會通過構造方法對對象進行初始化。
構造方法的特征:
- 與類同名
- 無返回值
- 未定義時,會創建一個預設構造方法
什麼是方法重載
方法重載就是同一個方法,在使用的時候能夠根據你參數的類型,從而表現出不同的行為
public class person {
public void eat(){
System.out.println("沒東西可以給我吃");
}
public void eat(Fruit fruit){
System.out.println("我正在吃水果");
}
...
}
方法重載提供了函數可擴展的能力,使用時僅需:
- 方法名相同
- 參數類型或參數個數不同
面向對象三大特性
封裝
優點:
- 松耦合
- 隱藏類的內部實現
- 對外部只暴露必要的介面,避免使用者使用非法的操作來改變類對象的內部結構
通常,我們在設計一個功能時,總是會把與該功能類似的所有屬性和行為都封裝在一個類中,這樣就可以避免功能內部的行為與別的類產生依賴性,別人使用你的功能時,僅僅需要知道如何調用你的介面來獲取想要的信息,不需要理會內部實現到底是怎麼做。
對於類的內部,一般開發者只提供必要的介面來訪問它的內部屬性,不會允許你直接操作它的內部,這樣做有利於保證使用者是按照設計者的設計邏輯控制使用,避免因為非法使用而導致錯誤的發生。
繼承
特點:
- 子類擁有父類非 private 的屬性和方法
- 子類具有自己的屬性和方法,可以擴展新的行為
- 子類還可以重寫從父類的行為
優點
- 實現代碼復用
- 方便設計嚴密的類登記結構體系(樹狀)
對象的繼承是一種 'is-a' 的關係,如果兩個對象 A 和 B ,可以描述為 ‘B 是 A’,則表明 B 可以繼承 A。
繼承關係不能簡單地理解為父親和兒子的關係,繼承關係實際上是一種特殊關係,就好比貓和哺乳動物,貓是哺乳動物的一種特殊抽象,因為它除了具備哺乳動物的特性外,還具備自己獨有的個性;比如它會抓老鼠、抓魚,這些並不是哺乳動物的共同特性。
當然,在設計類的時候,千萬不要為了繼承而繼承,過多的使用繼承會使得整個類層次結構變得十分複雜,使得類與類之間的耦合性變強,所以在使用繼承的時候千萬要理清對象與對象之間的關係;在沒有必要選擇繼承的情況下推薦使用組裝。
當然是否要使用繼承,這也得看具體情況,當兩個類擁有 ‘is-a’ 的關係,可以使用繼承;當兩個類擁有 'has-a' 的關係,可以使用組裝。
多態
多態也叫動態綁定,即是系統在運行時會根據對象的運行時類型,從而表現出不同的行為
特點:
- 子類以父類的身份出現
- 子類在工作時以自己的方式去實現
- 子類以父類的身份出現時,特有的屬性和行為不可以使用
與動態綁定相對的則是靜態綁定,C語言編程採用的就是靜態綁定。靜態綁定是在 編譯期進行,也就是說,你的程式在編譯的時候,他已經對各個方法的調用的地址已經做了綁定,所以在運行的時候,程式會直接根據你的方法地址去調用具體的方法。
而向面向對象編程多態採用的則是動態綁定,那麼動態綁定他到底是如何做的呢?程式運行的時候又是如何確定它的運行時類型從而調用對應的方法的呢?
之後再詳解。
抽象類
特點:
- 抽象類不能實例化
- 抽象方法是必須被子類重寫的方法
-
如果類中包含抽象方法,那個該類必須要被定義為抽象類
抽象類通常代表一個抽象概念,它提供一個繼承的出發點,當設計一個新的抽象類時,一定是要用來繼承的,所以,在一個以繼承關係形成的等級結構裡面,樹葉節點應當是具體類,而樹枝節點應當是抽象類
介面
特點:
- 介面不能實例化
- 欄位預設都是public static final 類型
- 只能定義抽象方法
介面和抽象類的區別
對於初學者來說,很多人在學習的時候,肯定都會有這麼一個疑問,介面和抽象類的區別到底是什麼,我們在設計程式的時候,什麼時候應該用抽象類,什麼時候用介面呢?
那麼先來說說這兩者的使用特點的區別:
- 抽象類可以定義抽象方法,也可以定義基本方法(即自己方法給方法做出實現),而介面只能定義抽象方法
- 一個類只能繼承一個抽象類,但可實現多個介面
- 子類可以選擇只實現部分抽象類的成員(這樣子類也是一個抽象類),但必須對介面所有成員進行實現
那麼現在就來說說它們在設計思想上的區別:
- 類是對對象的抽象;抽象類是對類的抽象;介面是對行為的抽象
- 如果行為跨越不同類型的對象(例如飛機、鳥,不是同一類對象,但都有飛行這種行為),可考慮使用介面;如果是對於一些相似的對象(例如貓、狗都屬於動物),則考慮抽象出抽象類,讓其繼承
- 從設計角度講,抽象類是對子類公共部分的抽象,而介面根本不知子類的存在,而是預先定義了一套行為
也就是說,不論是介面、抽象類、類甚至對象,都是在不同層次、不同角度進行抽象的結果,它們的共性就是抽象。通常抽象類是對目前一類存在共性的子類的一種泛化,通過抽離出子類間的共同屬性和行為,從而進行抽象的一種泛化;而介面則是預先定義了一套有關聯的行為,至於誰會實現這套行為,開發者自行決定,而我要做的只是告訴介面的實現類你擁有哪些行為而已。