2011-02-13 88 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)运行时多态性:导致动态绑定。覆盖(在后续子类中重新定义方法)是实现运行时多态性的一种方式。