2.3 多型

   任何不只一個IS-AJAVA物件就稱為多型。簡單的說,就是一個CLASS裡,使用同一資料形態宣告多種不同物件,而這些物件皆擁有同樣名稱的method各自提供該物件所需的功能。

有點不太會表達,就看個程式比較快。

<<<Example>>>

seiyuu s1 = new akira();

seiyuu s2 = new suzumura(); 

seiyuu s3 = new sakurai();

s1.getDramaList();

s2.getDramaList();

s3.getDramaList();

我一定要解釋一下我在寫啥XD。有一個CLASS叫聲優(seiyuu),然後有3subclass繼承他,分別是akirasuzumurasakurai,不要懷疑,這三個就是代表小石、0013 (灑花)

然後宣告完後就列出各自的Drama列表,天啊!我怎麼會舉出這麼貼切的例子呀!(大心)

嗯,多型就講到這XD

 

2.4 Overriding and Overloading

2.4.1 Overriding

 

<<< Concept >>>

只要繼承某一Class Asubclass就可override Amethod(除了宣告為finalmethod之外)

Abstract method(抽象方法)就是強迫一定要OverrideMethod

<<<好處>>>

Superclass有的method,可在subclass以同一名稱改寫為適用的method

<<<Rules>>>

1、   StaticFinal宣告的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

2.4.2 Overloading

<<< 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 ErrorAnimaleat 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

 

 


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 SkyChord 的頭像
    SkyChord

    No fUtUrE

    SkyChord 發表在 痞客邦 留言(0) 人氣()