回答您的問題:
- 它在運行根據不同的對象選擇更專業的方法被用來調用它的能力。
- 當然。多態性可能在沒有涉及抽象類的情況下發生。
- 不,超載/覆蓋不是多態性的類型。
下面是一個沒有涉及抽象類時發生多態性的例子。
// 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,則將調用A
的a
方法。如果它被稱爲B,B
的a
方法將被調用。這種在運行時改變實際被調用方法的能力叫做多態性。
超載幾乎沒有任何關係多態性。事實上,如果你願意,你可以重載重載而不涉及繼承。你甚至可以有超載沒有對象方向參與。 超載只是讓兩個函數存在相同的名稱,但具有不同的參數。
另一方面,覆蓋只是重新定義專用(繼承)類的方法。 覆蓋一種方法是多態性發生的必要條件。否則,在運行時將不是雙重可能性(仔細查看示例)。
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:來自希臘。意思是表格。
所以在多態性有「多」(聚)調用一個方法的 「形式」(變身)。哪一個將被調用,取決於用於調用該方法的對象。
重載與子類型/接口(Java)多態性是正交的。每個重載的方法都有* distinct *簽名。編譯器只是節省了選擇(可能更好)獨特名稱的努力:-) – 2011-02-13 18:57:08