覆盖方法(早期连接)并放置“null”

时间:2014-03-06 21:14:18

标签: java override

大家早上好。 我以为我知道覆盖和超载意味着什么,并试图向我的朋友解释。一切都很好,但当我回到家时,我决定写下这个例子。

    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和 在赛车中打印(双人) 这条消息很明显。 等级是否影响这个以及为什么?请告诉我我缺少的东西。

1 个答案:

答案 0 :(得分:5)

在决定调用哪个方法时,Java总是尝试寻找最具体的匹配。请参阅JLS Section 15.12.2,特别是

部分
  

如果找不到子类型适用的方法,则搜索适用的方法将继续第2阶段(§15.12.2.3)。
   否则,在子类型适用的方法中选择最具体的方法(第15.12.2.5节)。

在第一个带有参数null的示例中,Dodge是最具体的参数匹配,因为它继承自Car,所以没有问题。
然而,在你的上一个例子中,没有明显的赢家,因为候选人DoubleBigInteger都没有从另一个中继承。因此,您会出现歧义错误。