2.3 多型
※ 任何不只一個IS-A的JAVA物件就稱為多型。簡單的說,就是一個CLASS裡,使用同一資料形態宣告多種不同物件,而這些物件皆擁有同樣名稱的method各自提供該物件所需的功能。
有點不太會表達,就看個程式比較快。
<<<Example>>>
seiyuu s1 = new akira();
seiyuu s2 = new suzumura();
seiyuu s3 = new sakurai();
s1.getDramaList();
s2.getDramaList();
s3.getDramaList();
我一定要解釋一下我在寫啥XD。有一個CLASS叫聲優(seiyuu),然後有3個subclass繼承他,分別是akira、suzumura、sakurai,不要懷疑,這三個就是代表小石、00和13 (灑花)
然後宣告完後就列出各自的Drama列表,天啊!我怎麼會舉出這麼貼切的例子呀!(大心)
嗯,多型就講到這XD
2.4 Overriding and Overloading
<<< Concept >>>
只要繼承某一Class A,subclass就可override A之method(除了宣告為final個method之外)。
※ Abstract method(抽象方法)就是強迫一定要Override的Method。
<<<好處>>>
Superclass有的method,可在subclass以同一名稱改寫為適用的method。
<<<Rules>>>
1、 以Static和Final宣告的Method是不能Override的唷!
2、 宣告為啥型態,呼叫時就CALL那個型態的Method,而不是宣告之物件的method。
3、 Overriding要注意例外的處理。
<<<非法的Overriding>>>
假如某一Superclass是長這樣:
public class seiyuu
{
public void getDramaList(){} //硬是要知道他們所有的Drama XDD
}
要Override的話就不能像這樣寫:
1、 private void getDramaList() // 怎麼可以宣告的比老爸更嚴格呢!!
2、 public void getDramaList() throws IOException //老爸都沒例外處理了,例外是要丟給鬼嗎!?
3、 public void getDramaList(String Name) //這是overload好嗎,要Override請給一樣的參數。
4、 public String getDramaList() //回傳型態不一樣所以不是Override,而且參數和老爸一樣所以也不是overload。
<<< Concept >>>
可使一個CLASS中使用多個同名的Method,且可用不同的參數。
<<<Rules>>>
1、 MUST change parameter list
2、 CAN change return type
3、 CAN change the access modifier
4、 CAN declare new or broader Exception
5、 A method CAN be overloaded in the same class or in a subclass.
<<<小結>>>
哪一個override method會被呼叫,取決於:
Runtime時該物件之資料型態來決定,多型則是取決於Compiler time傳入的參數型態。
<<< Example >>>
給定程式:
public class Animal {
public void eat() {
System.out.println("Generic Animal Eating Generically");
}
}
public class Horse extends Animal {
public void eat() {
System.out.println("Horse eating hay ");
}
public void eat(String s) {
System.out.println("Horse eating " + s);
}
}
呼叫函式:
Animal a = new Animal();
a.eat();
執行結果:Generic Animal Eating Generically
----------------------------------------------------------------------------
Horse h = new Horse();
h.eat();
執行結果:Horse eating hay
----------------------------------------------------------------------------
Animal ah = new Horse();
ah.eat();
執行結果:Horse eating hay
----------------------------------------------------------------------------
Horse he = new Horse();
he.eat("Apples");
執行結果:Horse eating Apples
----------------------------------------------------------------------------
Animal a2 = new Animal();
a2.eat("treats");
執行結果:Compiler Error,Animal的eat method沒有參數
----------------------------------------------------------------------------
Animal ah2 = new Horse();
ah2.eat("Carrots");
執行結果:同上,因為宣告成Animal,所以Compiler只看Animal裡的method
<<< Overriddng vs. Overloading >>>
| Overloaded Method | Overridded Method |
Parameter | 必須改變 | 不能改變 |
Return Type | 可以改變 | 除了Convariant回傳外,其餘不能改 |
Exception | 可以改變 | 可減少或消除,不能定義更多更廣的 |
Access | 可以改變 | 限制不能更嚴格,可以寬鬆一點 |
Invocation | 參考型態決定哪個多載Method | 物件形態決定呼叫哪一個Method |
留言列表