回答您的问题:
- 它在运行根据不同的对象选择更专业的方法被用来调用它的能力。
- 当然。多态性可能在没有涉及抽象类的情况下发生。
- 不,超载/覆盖不是多态性的类型。
下面是一个没有涉及抽象类时发生多态性的例子。
// 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