多态性 - 重载/覆盖

时间:2011-02-13 18:46:09

标签: java polymorphism overloading override

我知道StackOverflow已经解决了这个问题,并且已经发布了很多问题。 我可能已经读过它们中的每一个但是,有这个令人唠叨的疑问:我认为我理解重载很好,并且覆盖。让我变形的是多态性。

例如,this question接受的答案通过shape.Draw()解释了这一点。我很困惑这与Overriding有什么不同(其他时候我对它与Overloading的不同之处感到困惑)。

另外 - 多态性本质上是指从抽象类派生出来的吗? (我想我在这个主题上读到的几乎所有答案都使用了一个抽象的动物类,让一只猫和一只狗喵喵/吠叫:)

总结,我的问题是:

  1. 什么是多态性w.r.t.重载和覆盖?

  2. 有人可以在没有抽象课的情况下解释多态性 - 谢谢!

  3. 重载/覆盖不是多态的子类型,是吗?

  4. 编辑添加第3个问题并修改第2个问题。

3 个答案:

答案 0 :(得分:7)

回答你的问题:

  1. 能够在运行时中选择更专业的方法,具体取决于用于调用它的对象。
  2. 当然。多态性可能在没有涉及抽象类的情况下发生。
  3. 不,重载/覆盖不是多态的类型。
  4. 这是一个多态性发生的例子,没有涉及抽象类。

    // 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的{​​{1}}方法。如果通过引用 B 调用它,则会调用a的{​​{1}}方法。这种在运行时更改被调用的实际方法的能力称为多态

    重载几乎与多态无关。事实上,如果你愿意,你可以在没有继承的情况下实现重载。您甚至可以重载,但不涉及面向对象重载只是让两个函数存在,但名称相同但参数不同。

    另一方面,

    覆盖只是在专用(继承)类上重新定义方法。 覆盖方法是多态发生的必要条件。否则,运行时将没有 DUAL POSSIBILITIES (仔细查看示例)。

    C类是理解这一切的关键:

    B

    Poly :来自 greek 。意味着很多变形:来自 greek 。意味着形式

    所以在多态中有“很多” poly “形式”变形)调用方法。将调用哪一个取决于用于调用方法的对象。

答案 1 :(得分:1)

实际上,在重载和覆盖之外,多态性并不是独立的。

两者 - 重载和覆盖 - 是一种特定类型的多态:

  • 重载称为adhoc-polymorphism。
  • 覆盖在面向对象中用于类型多态,以在子类上实现不同的行为。

答案 2 :(得分:0)

多态性是一种OOP概念,其中以多种方式执行单个任务。例如。您可以通过借记卡,通过网上银行支付账单。

有两种类型:

1)编译时间多态:导致静态绑定(编译器用来匹配签名的签名匹配技术)。运算符重载,函数重载实际上是一种实现编译时多态的方法。

2)运行时多态:导致动态绑定。覆盖(在后续子类中重新定义方法)是实现运行时多态的一种方法。