📅  最后修改于: 2020-03-30 14:59:37             🧑  作者: Mango
在Java中,重载Java中的方法非常普遍。下面是一个有趣的Java程序。
public class Test
{
// Overloaded方法
public void fun(Integer i)
{
System.out.println("fun(Integer ) ");
}
public void fun(String name)
{
System.out.println("fun(String ) ");
}
// 测试代码
public static void main(String [] args)
{
Test mv = new Test();
// 引起报错
mv.fun(null);
}
}
输出:
22: error: reference to fun is ambiguous
mv.fun(null);
^
both method fun(Integer) in Test and method fun(String) in Test match
1 error
在上述情况下出现编译时错误的原因是,这里的方法参数Integer和String都不是Java中的原始数据类型。这意味着它们接受空值。当我们将null值传递给method1时,编译器会迷惑它必须选择哪个方法,因为两者都接受null。
除非我们有意传递空值,否则不会发生此编译时错误。例如,请参见下面的场景,在编码时我们通常会遵循以下场景。
public class Test
{
// Overloaded方法
public void fun(Integer i)
{
System.out.println("fun(Integer ) ");
}
public void fun(String name)
{
System.out.println("fun(String ) ");
}
// 测试代码
public static void main(String [] args)
{
Test mv = new Test();
Integer arg = null;
// 不是编译器错误
mv.fun(arg);
}
}
输出:
fun(Integer )
在上述情况下,如果由于表达式的结果“ arg”值为空,则将空值传递给method1。在这里我们不会得到编译时错误,因为我们指定了参数为Integer类型,因此编译器选择method1(Integer i)并执行其中的代码。
注意:当重写的方法参数是原始数据类型时,此问题将不会持续。因为编译器将选择最合适的方法并执行它。