java – Polymorphism – 重载/覆盖

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

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

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

总之,我的问题是:

>什么是多态性w.r.t.重载和覆盖?
>有人可以在没有抽象类的情况下解释多态性 – 谢谢!
>重载/覆盖不是多态的子类型,是吗?

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

解决方法:

回答你的问题:

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

这是一个多态性发生的例子,没有涉及抽象类.

// 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方法可以使用对象A的引用或对B对象的引用来调用.如果通过引用A调用它,则将调用A的方法.如果通过引用B调用它,则将调用B的方法.这种在运行时改变被调用的实际方法的能力称为多态.

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

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

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
    }
}

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

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

上一篇:动态方法调度如何在Java中工作


下一篇:java – 未调用子类抽象方法