关于java:Polymorphism – 重载/覆盖

Polymorphism - Overloading/Overriding

我知道这个问题已经在StackOverflow上解决了,并且已经有很多问题发布在这个上面。我可能读过每一本书,但是,有一个令人费解的疑问:我认为我很好地理解超载和超负荷。让我着迷的是多态性。

例如,对这个问题的公认答案用shape.Draw()解释了这一点。我对这与重写有何不同感到困惑(其他时候我对它与重载有何不同感到困惑)。

同样-多态性是否意味着从抽象类派生?(我想我读过的关于这个主题的几乎所有答案都使用了一个抽象的动物类,让猫和狗发出呜呜/吠声:)

综上所述,我的问题是:

  • 什么是多态性w.r.t.重载和重写?

  • 有人能解释一下没有抽象类的多态性吗?谢谢!

  • 重载/重写不是多态性的子类型,是吗?

  • 编辑以添加第三个问题并修改第二个问题。


    要回答您的问题:

  • 它能够在运行时根据调用它的对象选择更专门化的方法。
  • 当然。多态性可以在不涉及抽象类的情况下发生。
  • 不,重载/重写不是多态性的类型。
  • 这里有一个多态性发生的例子,不涉及抽象类。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    // 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对象的引用来调用。如果通过引用来调用它,那么将调用AA方法。如果调用它时引用了b,那么将调用BA方法。这种在运行时改变被调用的实际方法的能力称为多态性。

    重载与多态性几乎没有任何关系。事实上,如果需要的话,可以在不涉及继承的情况下进行重载。甚至可以在不涉及对象方向的情况下进行重载。重载只是让两个函数以相同的名称存在,但参数不同。

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    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
        }
    }

    保利:来自希腊。意味着很多。变形:来自希腊语。意味着形式。

    因此,在多态性中,调用方法有"多"(poly)"形式"(morp)。将调用哪个,取决于用于调用方法的对象。


    实际上,除了超负荷和超负荷之外,聚合体并不是一个独立的东西。

    重载和重写都是一种特定类型的多态性:

    • 过载被称为即席多态性。
    • 重写用于类型多态的对象定向,以在子类上实现不同的行为。


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

    它有两种类型:

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

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