大家早上好。 我以为我知道覆盖和超载意味着什么,并试图向我的朋友解释。一切都很好,但当我回到家时,我决定写下这个例子。
public class Car{
public void say(){
System.out.println("Dodge");
}
public static void main(String[] args){
Car c = new Dodge();
new Car().print(c);
}
public void print(Car t){
System.out.println("Car");
}
public void print(Dodge b){
System.out.println("Dodge");
}
}
class Dodge extends Car{
public void say(){
System.out.println("Dodge");
}
}
很明显,如果我们运行此代码:“Car”将是输出。因为编译器会找到采用格式对象Car的方法。 但是如果我们改变这样的主要方法呢:
public static void main(String[] args){
new Car().print(null);
}
输出将是:“道奇”,我无法弄清楚为什么? smb可以解释一下吗?
P.S。我试过写了这段代码:
public class Car{
public void say(){
System.out.println("Dodge");
}
public static void main(String[] args){
new Car().print(null);
}
public void print(BigInteger t){
System.out.println("Car");
}
public void print(Double b){
System.out.println("Dodge");
}
} 和Idea告诉我: 模糊的方法调用。两者都打印(BigInteger)在Car和 在赛车中打印(双人) 这条消息很明显。 等级是否影响这个以及为什么?请告诉我我缺少的东西。
答案 0 :(得分:5)
在决定调用哪个方法时,Java总是尝试寻找最具体的匹配。请参阅JLS Section 15.12.2,特别是
部分如果找不到子类型适用的方法,则搜索适用的方法将继续第2阶段(§15.12.2.3)。
否则,在子类型适用的方法中选择最具体的方法(第15.12.2.5节)。
在第一个带有参数null
的示例中,Dodge
是最具体的参数匹配,因为它继承自Car
,所以没有问题。
然而,在你的上一个例子中,没有明显的赢家,因为候选人Double
和BigInteger
都没有从另一个中继承。因此,您会出现歧义错误。