[Java] Absolute Java (5E) Ch 7 (1)
Overview - Define inheritance, polymorphism, overloading, overriding,
and virtual method invocation
1. 為何需要繼承 inheritance ?
看看下面的兩個class
其實 Employee 跟 Manager 只差一個欄位,就要把所有code的method重寫一遍,很麻煩,要可以重複再利用會方便很多,所以出現了Inheritance的概念。
Java 的繼承用 extends 這個關鍵字
單一繼承,只繼承來自一個人
多重繼承,像是我就同時繼承來自兩個人 (父母)
IS-A relationship
所謂 is a:"是其中一種" 的概念
所以Manager 繼承 Employee 其實 Manager is a Employee 也是成立的
Extend 延伸關係,擴充的概念,越下方的地方需要被定義的屬性就越多
圖書館,PTT,選課:沒有Extend延伸關係
生物,族譜,(遊戲) 技能轉職,貨品分類
例1:
圓錐曲線 橢圓 圓 雙曲線 拋物線
圓錐曲線 -- 橢圓 -- 圓
| |
雙曲線 拋物線
上面的hierarchy是以IS-A的概念畫出的
例2:
實數 -- 有理數 -- 整數
這也是以IS-A的概念畫出的
回到圖例:
Employee <-- Manager <-- Director
這是用 Extend 的概念畫出來的
越上層的類別,所能夠包含的物件種類越多,所以共通屬性越少
越下層的類別,所能夠包含的物件種類越少,所以共通屬性越多
在這概念之下: 圓(半徑) <-- 橢圓(長軸,短軸)
因為橢圓要知道長軸短軸,屬性較多
而圓只需要知道半徑就好,屬性較少
但其實 圓 擴充自 橢圓 是限制條件擴充:長軸 = 短軸
所以應該寫成這樣 橢圓 <-- 圓(加上擴充條件)
針對擴充的東西,要使用原來的function可能會更有限制,
所以要把一些原先繼承來的方法(function)來Override 成更有限制的版本
Protected 是讓有繼承他的人才看得到 getDetails() 原本的Employee版本在Manager Class當中不夠用了 所以把原本的Method給override掉! |
這裡的name salary birthDate是private的,所以不能直接看到,
必須call 到 parent 的 method getDetails 才有辦法得到
在child裡面要call parent的method就用super的關鍵字
Polymorphism
Employee type的 reference 可以指向 Manager 的物件
因為 Manager 是一種 Employee,
反之 Manager type 的 reference 不能指向 Employee 物件!
因為 Employee 不一定是 Manager
實際操作:
如果把A裡面的 x 改成 private 則需要有getter setter
A type的 reference 可以指的到 B
parent 的 reference 可以指向他被繼承的所有child 物件 !!
因為Y 是 X 的 subclass 所以,這裡的B是A的child,B override 的 m2()只能return 比原本A type m2() return X 還要同等層級X或是後面層級的subclass Y
例如:台大規定超過128學分畢業
台大資管系override掉學校的規定超過132學分畢業
Overide v.s. Overloading
Overload: 同一個Class對於一個function寫很多種不同parameter與return type的版本
Override:不同Class之間,同一個function,傳進的參數也相同情形下,return做的事情不一樣。
這裡的m4不是override 因為參數不一樣了!是overload!!
final
final 放在函數前面,代表這個函數不能再被override!!
final 放在變數前面,代表這個變數值不能再被改
final 放在Class前面,代表這個Class不能再被繼承!
觀念:Constructor 不能被繼承!
留言
張貼留言