Java 当方法具有相同的名称但具有不同的签名时,是否重写方法?

Java 当方法具有相同的名称但具有不同的签名时,是否重写方法?,java,methods,overriding,Java,Methods,Overriding,在上面的类中,超类中的方法具有Object类型的参数,而子类具有String类型的参数。String是Object的子类。我的问题是,在这种情况下方法是否被重写?否,它的方法重载。为了使它成为重写方法签名的方法,超类方法和子类方法应该是相同的。浏览博客文章,详细了解这两个问题及其差异你提出的问题引起的最著名的困惑例子是equals: public class Superclass { void method(Object a){ } } public class Subclas

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

否,它的方法重载。为了使它成为重写方法签名的方法,超类方法和子类方法应该是相同的。浏览博客文章,详细了解这两个问题及其差异

你提出的问题引起的最著名的困惑例子是
equals

public class Superclass {

   void method(Object a){
   }
}


public class Subclass extends Superclass {

    void method(String a){
    }
}
许多人认为这是对
equals
的有效覆盖,但实际上它只是另一种与
对象#equals(Object)
无关的方法,不会涉及equals比较

这是Java类型系统中已知的陷阱之一,所以请小心操作

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


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

+1对于编写
boolean equals(MyClass o)的人来说,这是一个常见的混淆源可能值得注意的是,您可以使用更具体的返回类型进行重写。当然,泛型也让所有这些变得有趣。@PeterLawrey是的,我见过很多人犯过很多次这样的错误。@JonSkeet Java 6中有一个bug,它允许使用泛型通过返回类型重载@是的,泛型需要另一个层次的理解。这确实让我大吃一惊……Java6以后的版本中有一个覆盖注释,使链接显式。如果在子类上放置(at)Override,它会说它未被重写。。
public class Banana {
  private final double weight;
  public boolean equals(Banana that) { return this.weight == that.weight; }
}
public abstract class FruitTree {
  public abstract Object getFruit();
}
public class BananaTree {
  ...
  @Override public Banana getFruit() { return this.bananas.iterator().next(); }
}