public class Superclass {
void method(Object a){
}
}
public class Subclass extends Superclass {
void method(String a){
}
}
在上面的类中,超类中的方法具有 Object 类型的参数,而 Subclass 具有 String 类型的参数。String 是 Object 的子类。我的问题是,在这种情况下方法是否被覆盖?
public class Superclass {
void method(Object a){
}
}
public class Subclass extends Superclass {
void method(String a){
}
}
在上面的类中,超类中的方法具有 Object 类型的参数,而 Subclass 具有 String 类型的参数。String 是 Object 的子类。我的问题是,在这种情况下方法是否被覆盖?
不,它的方法重载。对于覆盖超类方法和子类方法的方法签名的方法,它应该是相同的。浏览 这篇博文,详细了解这两者及其区别
您提出的问题引起的最著名的混淆示例包括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(); }
}
请注意,方法签名的概念不包括返回类型。方法签名是静态(编译时)方法解析机制中的关键概念,每个签名都是动态方法分派的一个独立点。