多态性 - 重载/覆盖

use*_*037 3 java polymorphism overriding overloading

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

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

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

总之,我的问题是:

  1. 什么是多态性wrt重载和覆盖?

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

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

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

Pab*_*ruz 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

类中的多态性C发生是因为SomeStatic可以使用对象引用对B对象引用来调用方法.如果它被称为与一个参考,Aa方法将被调用.如果它被称为与一个参考,Ba方法将被调用.这种在运行时改变被调用的实际方法的能力称为多态.

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

另一方面,重写只是在专用(继承)类上重新定义方法.覆盖方法对于多态发生是必要的.否则,在运行时将没有双重可能性(仔细查看示例).

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
    }
}
Run Code Online (Sandbox Code Playgroud)

保利:来自希腊.意味着很多. 变形:来自希腊.手段形式.

所以在多态性中,调用方法有"很多"(多边形)"形式"(变形).将调用哪一个,取决于用于调用方法的对象.