多态性 – 重载/覆盖
我知道这个问题已经在StackOverflow上完成,并且已经有很多问题已经发布。 我可能已经阅读了它们中的每一个但是,有这个令人唠叨的疑问 :我认为我理解重载很好,并且覆盖。 让我变形的是多态性。
例如, 这个问题的接受答案用shape.Draw()
解释了这一点。 我很困惑这与Overriding有什么不同(其他时候我对它与Overloading的不同之处感到困惑)。
此外 – 多态性本质上是指从抽象类派生出来的吗? (我想我几乎所有关于这个主题的答案都使用了一个抽象的动物类,让一只猫和一只狗喵喵叫/吠:)
总之 ,我的问题是:
-
什么是多态性wrt重载和覆盖?
-
有人可以在没有抽象类的情况下解释多态性 – 谢谢!
-
重载/覆盖不是多态的子类型,是吗?
编辑添加第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 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)运行时多态:导致动态绑定。 覆盖(在后续子类中重新定义方法)是实现运行时多态的一种方法。