大家早上好.我以为我知道覆盖和超载意味着什么,并试图向我的朋友解释.一切都很好,但当我回到家时,我决定写下这个例子.
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");
}
}
Run Code Online (Sandbox Code Playgroud)
很明显,如果我们运行这段代码:"Car"将是输出.因为编译器会找到采用格式对象Car的方法.但是如果我们改变这样的主要方法呢:
public static void main(String[] args){
new Car().print(null);
}
Run Code Online (Sandbox Code Playgroud)
输出将是:"道奇",我无法弄清楚为什么?可以smb解释一下吗?
PS我试过写过这段代码:
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");
}
Run Code Online (Sandbox Code Playgroud)
和Idea告诉我: 模糊的方法调用.在Car中打印(BigInteger)和在Car中打印(Double) 这个消息很明显.等级是否影响这个以及为什么?请告诉我我错过了什么.
在决定调用哪个方法时,Java总是尝试寻找最具体的匹配.见JLS第15.12.2节,特别是该部分
如果找不到子类型适用的方法,则继续第2阶段(第15.12.2.3节)搜索适用的方法.
否则,在子类型适用的方法中选择最具体的方法(第15.12.2.5节).
在你的第一个带参数的例子中null,Dodge是最具体的参数匹配,因为它继承自Car,所以没有问题.
然而,在你的最后一个例子中,没有明显的胜利者,因为没有候选人Double和BigInteger继承人.因此,您会得到歧义错误.
| 归档时间: |
|
| 查看次数: |
58 次 |
| 最近记录: |