请能有人详细解释一下。
public class Car
{
public void disp(Object o)
{
System.out.println("Object called :");
}
public void disp(String s)
{
System.out.println("String called :"+s);
}
}
调用以下主要方法
public class CarMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
Car car=new Car();
car.disp(null);
}
}
输出:调用的字符串:空
第二种情况,如果我将Disp(Object o)中的Integer而不是Object传递给我,那么我将报错,因为“方法Disp(Integer)对于Car类型是不明确的”
据了解,Java包装器在这里起主要作用,但需要很好的解释。
请帮助。
答案 0 :(得分:2)
让我们两种情况一一处理:
情况1::当我们有两个显示
overloaded
函数时,一个具有参数Object
,另一个具有参数String
:
public void disp(String s) { System.out.println("String called :"+s); }
public void disp(Object o) { System.out.println("Object called :"); }
在这种情况下,将引用最具体的方法。根据{{3}}:
如果m和m严格比另一种方法m2更具体 仅当m1比m2更具体且m2不比m2更具体时 m1。
因此,在上述情况下,接受String
的函数比接受Object
的函数更具体,但是,相反的情况不成立。
因此,在这种情况下,当传递null
时,它将转到带有参数String的方法。但是,如果您传递(Object)null
,它将转到带有参数Object的方法。
car.disp(null); --> String called :null
car.disp((Object)null); --> Object called :
情况2::当我们有两个显示
overloaded
函数时,一个具有参数String
,另一个具有参数Integer
。
public void disp(String s) { System.out.println("String called :"+s); }
public void disp(Integer i) { System.out.println("Integer called :"+ i); }
在这种情况下,由于没有一个方法比另一个方法更具体,并且两个函数都可以接受空值,因此在null
的情况下无法确定适当的函数。但是,如果您传递(Integer)null
或(String)null
,则不会有歧义,可以调用适当的函数。
car.disp(null); --> Compile time error (The method disp(String) is ambiguous for the type Car)
car.disp((Integer)null); --> Integer called :null
car.disp((String)null); --> String called :null
答案 1 :(得分:0)
正如评论者所指出的,您没有disp(Integer..)
方法,如果您提供了该方法,则该方法调用可以与disp(12)
一起正常工作。
关于disp(null)
的问题,根据Java语言规范:
重载的方法和构造函数在编译时由 从以下方法中选择最具体的方法或构造函数: 适用。
基本上String
比Object
更具体,因此即使这两个都适用于null
,该方法的String版本也会被选择。