【问题标题】:why polymorphism doesn't matters when a method is overloaded?为什么当方法重载时多态无关紧要?
【发布时间】:2012-05-22 20:10:42
【问题描述】:

我知道重载的方法是在编译时根据调用该方法的引用类型确定的,而重写的方法是由调用该方法的引用的实际对象类型确定的,问题是为什么多态性只与重写有关而不是重载?

【问题讨论】:

  • 您所说的“唯一重要”是什么意思?如果你能给出一个具体的例子,说明会发生什么以及你期望会发生什么,这会有所帮助。
  • 我不明白这个问题。重载是另一种多态性,这次是函数而不是对象。你所说的“无关紧要”到底是什么意思?

标签: java oop overloading overriding


【解决方案1】:

使Java中的多态成为可能的实现机制是基于其第一个参数的运行时类型的方法的动态分派(在调用a.method(b, c)a可以被认为是方法的第一个参数)。因此,Java 是一种单一调度 OOP 语言。结果是所有其他参数不参与此机制,并且它们的类型在编译时静态确定。例如,如果你有

class MyObject {
  public boolean equals(MyObject o) { ... }
}

然后

MyObject m1 = new MyObject();
Object o = new MyObject();
System.out.println(m1.equals(o));

永远不能打印true,因为你的方法没有被调用。编译器看到了一个调用MyObject.equals(Object),并将其编译为对继承方法Object.equals(Object) 的调用。运行时方法调度机制只会决定调用哪个覆盖方法equals(Object)

【讨论】:

  • @Eslam 我可以尝试,但您需要合作:您到底了解我的回答中的哪些内容,以及您不了解的内容?
【解决方案2】:

多态,顾名思义,是指“相同形式”的方法在不同的上下文中表现出不同的行为。术语“相同的形式”意味着“相同的签名”。这意味着您不能将多态性与重载方法联系起来,因为它们一开始就有“不同的形式”。另一种思考方式是 - 您需要一个类型和一个子类型才能看到多态性的作用 - 重载方法再次在单个类的上下文中定义。

【讨论】:

    【解决方案3】:

    这是出于技术原因。通常只有this指针,作为方法隐藏的第一个参数,在运行时会被分析以确定要调用的方法。

    当其他参数也被分析时,它被称为Multiple Dispatch。有几种语言原生支持多分派。

    【讨论】:

      【解决方案4】:

      你对此感到困惑。
      Overloading是指在相同类(不是层次结构)中选择具有相同名称但不同签名的方法之一。
      @987654323 @ 在父类继承的方法中根据运行时类型选择同名方法。
      如果您有一个具有相同名称和签名的方法的基类和派生类,那么这是overriding,并在运行时确定正确的。

      对于overloading,编译器会在同一类中选择正确版本的方法来使用。
      无需查找运行时类型。编译器可以在编译时解决这个问题

      【讨论】:

      • 不是我的,但我猜这是因为 OP 在问题中表示他已经理解这些概念,但想知道为什么会有这样的差异。
      • 你对这个解释没有帮助。开始和除此之外实际上是不正确的,这将事情简化到不正确的程度。见stratos.me/2008/07/…
      • @MarkoTopolnik:但我想我解决了这个问题。我的意思是,没有必要为重载方法找到运行时类型,因为重载与继承无关。
      • 同一类中不允许签名两次或多次(阅读链接并查看签名的定义)。这将导致编译时错误。对于覆盖,名称无关紧要; 签名才是最重要的。如果 B 类中的方法与 A 类中的方法名称相同,但签名不同,则这不是覆盖,并且可以在编译时绑定该方法。
      • A signature is not permitted twice or more in the same class。哦,好的,我更正了这些错误的陈述。
      猜你喜欢
      • 2012-03-17
      • 1970-01-01
      • 2017-02-15
      • 1970-01-01
      • 2021-07-16
      • 2010-12-22
      • 2021-01-15
      • 2014-02-28
      • 2016-06-07
      相关资源
      最近更新 更多