匆匆忙忙行軍式的步伐邁向抽象類別的世界,老實說真的有點挫折,跟不太上同學們的腳步,對於我這張程式白紙來說果然不是件容易的事!不過我相信每天重複做的事還是會進步的!我知道我有在前進,但我得更努力才能追上同學們的腳步了><
應該算是一個好消息(? 我終於被距離給打敗了,在每日睡眠不足的情況下通勤兩小時左右的時間實在太舟車勞頓了!
所以我決定尋找一個新的落腳處
首先理解的是繼承就是修改與擴充一個類別的內容,將一些共有的屬性和方法定義在這個類中,當某一個類需要使用到這些方法和屬性的時候,就可以通過extends關鍵字直接調用父類別中的成員變量和方法,增加程式的便利性。
舉例來說:
有一個Animal的類別
屬性:體重,名字,年齡
方法:移動
再定義一個Cat的類別
屬性:體重,名字,年齡,毛色
方法:移動,吃,睡
其中很多東西都跟動物重複。
在現實中,貓是一種動物,應該擁有動物的屬性及方法,然後再加上貓專屬的屬性和方法(擴充)。
我們可以把動物當成父類別,狗『繼承』動物,貓是『子類別』。
子類別會擁有父類別的所有屬性,方法,再加上自己定義的屬性及方法,所以可以說子類別是父類別的延伸(extend)。
父類別的建構子 super(.)一定要寫在第一行!
利用super(.)可以呼叫父類別中定義好相應參數的建構子,很多時候父類別已經定義好的東西,子類別可直接調用,設計上比較好維護,設計邏輯比較有階層性。
如果父類別沒有方法,子類別新增一個方法,叫做擴充。有方法,則子類別去覆寫,叫修改,也就是@override。
Java有規範,父子類別都有的情況下,優先使用子類別。
覆寫(Override):當父子類別有同署名 ( 同名同參數 ) 的方法,子類別會去覆蓋掉父類別的方法。
多載(Overloading):不論在相同類別還是父子類別,有同名不同參數的方法,則會同時存在。
子類別在 @Override 方法的時候,回傳值必須是父類別**“原本回傳值的類別” 或是 “原本回傳值的子類別”**。
因此,如果是回傳基本資料型態,基本資料型態沒有繼承關係,所以不能更改成回傳其他基本資料型態。
假設有三個子類別都繼承自某父類別,則可以宣告一個父類別的變數是子類別的實體,這就是最基礎的多型。
舉例來說可以說Square就是Shape-->Shape shape=new Square();
//宣告Shape變數放入Square實體,Square一定包含Shape所有內容
當定義類別時,可以僅宣告方法名稱而不實作,這樣的方法稱之為「抽象方法」(Abstract method),如果一個類別中包含了抽象方法,則該類別稱之為「抽象類別」(Abstract class),抽象類別是個未定義完全的類別,所以它不能被用來生成物件,它只能被擴充並於擴充後完成未完成的抽象方法定義。
(抽象類別有建構子,但不能被創建出實體,抽象類別在概念上就是抽象的,不應該有實體。)
1.抽象方法將實現方法的時間點延後,交給子類別去實現。
2.如果子類別不是抽象類別,裡面就不能包含抽象方法。
3.當子類別繼承抽象類別就會@override把抽象方法實現(但子類別也可以是抽象類別,延後方法實現的時間)
4.抽象方法一定要存在抽象類別中
抽象類別與介面有點像,兩個都不行被實體化成物件。
1.用於被繼承,類別要實作定義的抽象方法。
2.抽象類別中可以定義完整的方法(方法本體),可以只定義方法原型。
3.可以定義完整的資料欄位供繼承類別使用。
4.設計中心以資料為主體。
1.用於被實作,類別要實作定義的方法。
2.介面中只能定義方法原型,能有方法本體。
3.方法的修飾子必為public abstract。
4.設計中心以行為為主體。
5.一般來說有共同的概念可以繼承相同的抽象父類別,
若只是行為相同,以介面設計比較恰當。