public class Superclass {
void method(Object a){
}
}
public class Subclass extends Superclass {
void method(String a){
}
}
在上面的类中,Superclass中的方法具有Object类型的参数,而Subclass具有String类型的参数。 String是Object的子类。我的问题是,在这种情况下是方法覆盖吗?
答案 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(); }
}
请注意,方法签名的概念不包括返回类型。方法签名是静态(编译时)方法解析机制中的关键概念,每个签名是动态方法调度的一个单独点。