Java方法重载和包装器类

时间:2018-07-16 17:18:41

标签: java wrapper overloading method-overriding

请能有人详细解释一下。

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包装器在这里起主要作用,但需要很好的解释。

请帮助。

2 个答案:

答案 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语言规范:

  

重载的方法和构造函数在编译时由   从以下方法中选择最具体的方法或构造函数:   适用。

基本上StringObject更具体,因此即使这两个都适用于null,该方法的String版本也会被选择。