当方法具有相同名称但签名不同时,方法是否被覆盖?

时间:2013-05-13 09:30:55

标签: java methods override

public class Superclass {

   void method(Object a){
   }
}


public class Subclass extends Superclass {

    void method(String a){
    }
}

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

2 个答案:

答案 0 :(得分:7)

不,它的方法重载。因为它是覆盖超类方法和子类方法的方法签名的方法应该是相同的。浏览this博文,了解这两者及其细节差异

答案 1 :(得分:4)

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

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

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

这是Java类型系统的一个已知缺陷,所以要小心谨慎。

为了进一步混淆问题, 允许专门化返回类型(返回类型为 covariant ):

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

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