3
public class Superclass {

   void method(Object a){
   }
}


public class Subclass extends Superclass {

    void method(String a){
    }
}

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

4

2 回答 2

7

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

于 2013-05-13T09:33:10.417 回答
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(); }
}

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

于 2013-05-13T09:36:29.163 回答