2011-02-13 86 views
3

我知道這個問題已經在StackOverflow中完成了,並且已經發布了很多問題。 我可能已經閱讀了他們中的每一個,但是,這是一個瑣碎的疑問:我想我明白Overloading很好,Overriding。什麼讓我是多態。多態 - 超載/覆蓋

例如,對this question的接受答案用shape.Draw()來解釋。我很困惑,這與Overriding有什麼不同(其他時候我對它與Overloading不同有點混淆)。

此外,多態是否意味着從抽象類派生? (我想幾乎所有我在閱讀題目的答案使用一個抽象類動物,使一隻貓和一隻狗喵/樹皮:)

綜上所述,我的問題是:

  1. 什麼是多態性wrt重載和覆蓋?

  2. 有人請解釋沒有抽象類的多態性 - 謝謝!

  3. 重載/覆蓋不是多態性的亞型,是嗎?

編輯添加第三個問題並修改第二個問題。

+1

重載與子類型/接口(Java)多態性是正交的。每個重載的方法都有* distinct *簽名。編譯器只是節省了選擇(可能更好)獨特名稱的努力:-) – 2011-02-13 18:57:08

回答

7

回答您的問題:

  1. 它在運行根據不同的對象選擇更專業的方法被用來調用它的能力。
  2. 當然。多態性可能在沒有涉及抽象類的情況下發生。
  3. 不,超載/覆蓋不是多態性的類型。

下面是一個沒有涉及抽象類時發生多態性的例子。

// non abstract 
class A 
{ 
    public void a() 
    { 
     System.out.println("Hello from A"); 
    } 
} 

class B 
    extends A 
{ 
    @Override 
    public void a() 
    { 
     System.out.println("Hello from B"); 
    } 
} 

class C 
{ 
    public static void SomeStatic(A a) 
    { 
     // HERE IS WHERE POLYMORPHISM OCCUR 
     a.a(); 
    } 
} 

多態性C類的發生是因爲SomeStatic方法可以與參照對象引用B對象被調用。如果它被稱爲A,則將調用Aa方法。如果它被稱爲BBa方法將被調用。這種在運行時改變實際被調用方法的能力叫做多態性

超載幾乎沒有任何關係多態性。事實上,如果你願意,你可以重載重載而不涉及繼承。你甚至可以有超載沒有對象方向參與。 超載只是讓兩個函數存在相同的名稱,但具有不同的參數。

另一方面,覆蓋只是重新定義專用(繼承)類的方法。 覆蓋一種方法是多態性發生的必要條件。否則,在運行時將不是雙重可能性(仔細查看示例)。

C類是瞭解這一切的關鍵在於:

class Main 
{ 
    public static void main(String[] args) 
    { 
     A a = new A(); 
     B b = new B(); 
     C.SomeStatic(a); // will call A's a 
     C.SomeStatic(b); // will call B's a 
     // AND THIS IS POLYMORPHISM 
     // C will decide WHICH METHOD TO CALL 
     // only at runtime 
    } 
} 

:來自希臘。意思是很多Morph:來自希臘。意思是表格

所以在多態性「多」調用一個方法的 「形式」變身)。哪一個將被調用,取決於用於調用該方法的對象。

+0

@Pablo聖克魯斯 - 這正是讓我困惑的東西:)我假設在Java中的類B:A`的等效代碼是`Class B延伸A`。你不是**覆蓋** B類中A類的方法`a()`嗎? – user183037 2011-02-13 18:57:18

1

實際上,polymorpishm並不是獨立於重載和覆蓋之外的東西。

兩者 - 超載和重寫 - 是多態性的特定類型:

  • 超載被稱爲自組織多態。
  • 覆蓋用於類型多態性的對象方向以實現子類上的不同行爲。
0

多態性是一種OOP概念,其中以多種方式執行單個任務。例如。您可以通過借記卡通過網上銀行付款。

它是兩個類型的:

1)編譯時多態性:這導致靜態綁定(A簽名匹配技術,該技術使用編譯器來匹配簽名)。操作符重載,函數重載實際上是實現編譯時多態性的一種方式。

2)運行時多態性:導致動態綁定。覆蓋(在後續子類中重新定義方法)是實現運行時多態性的一種方式。