我知道这个问题已经在*中完成,并且已经有很多问题已经发布.我可能已经阅读了它们中的每一个但是,有这个令人唠叨的疑问:我认为我理解重载很好,并且覆盖.让我变形的是多态性.
例如,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
}
}
保利:来自希腊.意味着很多.
变形:来自希腊.手段形式.
所以在多态性中,调用方法有“很多”(多边形)“形式”(变形).将调用哪一个,取决于用于调用方法的对象.