Java 覆盖方法(早期连接)和放置;空";

Java 覆盖方法(早期连接)和放置;空";,java,overriding,Java,Overriding,大家早上好。 我想我知道覆盖和重载意味着什么,并试图向我的朋友解释。一切都很好,但当我回家后,我决定写这个例子 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 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能解释一下吗

顺便说一句,我试着写了以下代码:

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");
}
} 这个想法告诉我: 方法调用不明确。在车内和车内打印(BigInteger) 车内匹配打印(双张) 这一信息是显而易见的。
等级制度对此有影响吗?为什么?请告诉我我遗漏了什么。

在决定调用哪个方法时,Java总是尝试进行最具体的匹配。请参见,特别是该部分

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

在第一个参数为
null
的示例中,
Dodge
是最具体的参数匹配,因为它继承自
Car
,因此没有问题。

然而,在上一个示例中,没有明显的赢家,因为没有一个候选
Double
biginger
继承自另一个。因此,会出现歧义错误。

在决定调用哪个方法时,Java总是尝试进行最具体的匹配。请参见,特别是该部分

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

在第一个参数为
null
的示例中,
Dodge
是最具体的参数匹配,因为它继承自
Car
,因此没有问题。


然而,在上一个示例中,没有明显的赢家,因为没有一个候选
Double
biginger
继承自另一个。因此,您会得到歧义错误。

Double
biginger
是不相关的类。应该为
null
调用哪个方法,其中
null
可以用于其中一个?编译器不知道,是吗?如果是,你应该用一个cast来指定它。钉住它^你应该把它作为一个答案。@SotiriosDelimanolis:是的,你是对的,但它没有解释为什么它在第二个例子中打印
Dodge
。@GIJoe抱歉,刚才注意到有3个例子。在第二部分中,
Dodge
Car
是相关的,
Dodge
更具体,所以选择了一个。谢谢大家,这是一个有趣的讨论。
Double
biginger
是不相关的类。应该为
null
调用哪个方法,其中
null
可以用于其中一个?编译器不知道,是吗?如果是,你应该用一个cast来指定它。钉住它^你应该把它作为一个答案。@SotiriosDelimanolis:是的,你是对的,但它没有解释为什么它在第二个例子中打印
Dodge
。@GIJoe抱歉,刚才注意到有3个例子。在第二个例子中,
Dodge
Car
是相关的,而且
Dodge
更具体,所以选择了一个。谢谢大家,这是一个有趣的讨论。如果使用了
null
,为什么第二个例子会打印
Dodge
(有三个例子)@GIJoe:我只对
null
例子发表了评论,因为OP只是和那些混淆了。我将进行编辑以使其更清楚。他将其更改为第一个示例传递一个来自Dodge的对象,第二个示例创建一辆新车并传递null以打印(但它与Dodge?而不是Car?)匹配,第三种方法使用只接受BigInteger和Double的print方法传递null。@GIJoe:两个可能的
print
方法在两个示例中都在
Car
类中,因此我认为我在回答中已经涵盖了这两种情况。@Keppil这是一个很好的答案。非常感谢。我不知道如果使用了
null
,为什么第二个示例会打印
Dodge
(有三个示例)@GIJoe:我只对
null
示例进行了评论,因为OP只是把它们混淆了。我将进行编辑以使其更清楚。他将其更改为第一个示例传递一个来自Dodge的对象,第二个示例创建一辆新车并传递null以打印(但它与Dodge?而不是Car?)匹配,第三种方法使用只接受BigInteger和Double的print方法传递null。@GIJoe:两个可能的
print
方法在两个示例中都在
Car
类中,因此我认为我在回答中已经涵盖了这两种情况。@Keppil这是一个很好的答案。非常感谢。我不知道