Polymorphism - Overloading/Overriding
我知道这个问题已经在StackOverflow上解决了,并且已经有很多问题发布在这个上面。我可能读过每一本书,但是,有一个令人费解的疑问:我认为我很好地理解超载和超负荷。让我着迷的是多态性。
例如,对这个问题的公认答案用
同样-多态性是否意味着从抽象类派生?(我想我读过的关于这个主题的几乎所有答案都使用了一个抽象的动物类,让猫和狗发出呜呜/吠声:)
综上所述,我的问题是:
什么是多态性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 |
类
重载与多态性几乎没有任何关系。事实上,如果需要的话,可以在不涉及继承的情况下进行重载。甚至可以在不涉及对象方向的情况下进行重载。重载只是让两个函数以相同的名称存在,但参数不同。
另一方面,重写只是在专门的(继承的)类上重新定义一个方法。覆盖一个方法对于多态性的发生是必要的。否则,在运行时将不会有双重可能性(请仔细查看示例)。
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)运行时多态性:导致动态绑定。重写(在随后的子类中重新定义方法)是实现运行时多态性的一种方法。