Java 多态性-重载/重写
我知道这个问题在StackOverflow已经被问得死去活来了,而且已经有很多问题贴在上面了我可能已经阅读了其中的每一篇文章,但有一个小小的疑问:我认为我非常理解重载和重写。让我抓狂的是多态性 例如,对的公认答案用Java 多态性-重载/重写,java,polymorphism,overloading,overriding,Java,Polymorphism,Overloading,Overriding,我知道这个问题在StackOverflow已经被问得死去活来了,而且已经有很多问题贴在上面了我可能已经阅读了其中的每一篇文章,但有一个小小的疑问:我认为我非常理解重载和重写。让我抓狂的是多态性 例如,对的公认答案用shape.Draw()解释了这一点。我不知道这与重写有什么不同(其他时候我不知道它与重载有什么不同) 此外,多态性是否本质上意味着从抽象类派生?(我想我读过的关于这个话题的几乎所有答案都使用了一个抽象的动物类,让猫和狗喵喵叫/吠叫:) 总而言之,我的问题是: 什么是多态性w.r.t.
shape.Draw()
解释了这一点。我不知道这与重写有什么不同(其他时候我不知道它与重载有什么不同)
此外,多态性是否本质上意味着从抽象类派生?(我想我读过的关于这个话题的几乎所有答案都使用了一个抽象的动物类,让猫和狗喵喵叫/吠叫:)
总而言之,我的问题是:
编辑以添加第三个问题并修改第二个问题。回答您的问题:
// 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对象的引用来调用。如果调用时引用了a,则将调用a
的a
方法。如果调用时引用了B,则将调用B
的a
方法。这种在运行时改变被调用的实际方法的能力称为多态性
重载与多态性几乎没有任何关系。事实上,如果您愿意,您可以在不涉及继承的情况下进行重载。您甚至可以在不涉及对象定向的情况下进行重载重载只是让两个函数以相同的名称存在,但参数不同
另一方面,重写只是在一个专门化(继承的)类上重新定义一个方法重写要发生多态性,必须有一个方法。否则,在运行时将不会出现双可能性(仔细查看示例)
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
}
}
Poly:来自希腊语。表示多个。
变形:来自希腊语。表示形式
因此,在多态性中,有许多调用方法的形式。将调用哪一个,取决于用于调用该方法的对象。实际上,除了重载和重写之外,polymorpishm并不是独立的东西 重载和重写都是一种特定类型的多态性:
- 重载称为adhoc多态性
- 重写在面向对象中用于类型多态性,以在子类上实现不同的行为
2) 运行时多态性:导致动态绑定。重写(在后续子类中重新定义方法)是实现运行时多态性的一种方法。重载与子类型/接口(Java)多态性正交。每个重载方法都有一个不同的签名。编译器只是省去了选择(可能更好)唯一名称的工作:-@Pablo Santa Cruz-这正是让我困惑的地方:)我假设Java中
类B:A
的等效代码是类B扩展了A
。您不是正在重写类B中类a的方法a()
?好的,将语法更改为Java。不,情况正好相反:我正在重写类B上的类A的A
方法。@Pablo Santa Cruz-抱歉,修复了错误,但我的问题是-这怎么不是重写的示例?哦,我想我可能已经知道了-是因为这是对象类型而不是方法的不同吗?是的,是什么决定了调用哪个方法?它是对象的实际类型。不是方法。你重写了这个方法,也意味着你重新定义了它。只是吹毛求疵,但poly和morph是希腊语而不是拉丁语(ph和y通常是一个赠品;)