多态性 – 重载/覆盖

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

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

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

总之 ,我的问题是:

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

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

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

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

回答你的问题:

  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 aa(); } } 

发生C类中的多态性是因为SomeStatic方法可以使用对象A引用对B对象引用来调用 。 如果通过引用A调用它,则会调用A a方法。 如果通过引用B来调用它,则B将调用a方法。 这种在运行时更改被调用的实际方法的能力称为多态

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

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

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

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

因此,在多态性中 ,调用方法有“很多”多边形“forms”变形 )。 将调用哪一个取决于用于调用该方法的对象。

实际上,在重载和覆盖之外,多态性并不是一个单独的东西。

– 重载和重写 – 都是特定类型的多态:

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

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

它有两种类型:

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

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