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这是一个很好的答案。非常感谢。我不知道