【问题标题】:Are methods overridden when methods have the same name but different signatures?当方法名称相同但签名不同时,方法是否被覆盖?
【发布时间】:2013-05-13 09:30:54
【问题描述】:
public class Superclass {

   void method(Object a){
   }
}


public class Subclass extends Superclass {

    void method(String a){
    }
}

在上面的类中,超类中的方法具有 Object 类型的参数,而 Subclass 具有 String 类型的参数。 String 是 Object 的子类。我的问题是,在这种情况下方法是否被覆盖?

【问题讨论】:

  • Java 6 及更高版本有一个 Override 注释以使链接显式。如果你把 (at)Override 放在子类上,它会说它没有被覆盖..

标签: java methods overriding


【解决方案1】:

不,它的方法重载。对于覆盖超类方法和子类方法的方法签名的方法,它应该是相同的。浏览this 博文详细了解这两者及其区别

【讨论】:

  • +1 这是写boolean equals(MyClass o);的人的常见混淆来源
  • 值得注意的是,您可以使用更具体的返回类型进行覆盖。当然,泛型也让这一切变得有趣。
  • @PeterLawrey 是的,我见过很多人多次犯这个错误。
  • @JonSkeet Java 6 中有一个错误,它允许使用泛型按返回类型进行重载。 vanillajava.blogspot.co.uk/2011/02/…
  • @JonSkeet 是的,泛型需要另一个层次的理解。它确实让我大吃一惊......
【解决方案2】:

由您提出的问题引起的最有名的混淆示例涉及equals

public class Banana {
  private final double weight;
  public boolean equals(Banana that) { return this.weight == that.weight; }
}

许多人认为这是对equals 的有效覆盖,但实际上它只是另一种与Object#equals(Object) 无关的方法,不会参与等于比较。

这是 Java 类型系统的已知缺陷之一,因此请务必小心处理。

为了进一步混淆问题,您可以专门化返回类型(返回类型是协变):

public abstract class FruitTree {
  public abstract Object getFruit();
}
public class BananaTree {
  ...
  @Override public Banana getFruit() { return this.bananas.iterator().next(); }
}

请注意,方法签名的概念不包括返回类型。方法签名是静态(编译时)方法解析机制中的关键概念,每个签名都是动态方法分派的一个独立点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 2013-02-28
    • 2013-02-23
    相关资源
    最近更新 更多