关于方法重载的困惑

时间:2014-10-14 12:09:17

标签: java

我尝试了以下代码,但不了解输出:

Class A{
  public void print(Object o){
     System.out.println("Object");
  }
  public void print(String o){
     System.out.println("String");
  }  
  public static void main(String arr[]){
     A obj = new A();
     obj.print(null);
  }
}

输出:字符串

为什么?

感谢您的关注!

3 个答案:

答案 0 :(得分:2)

选择具有更具体参数类型的方法。 String比Object更具体。

请注意,如果您使用另一个print方法,例如Integer参数,则会出现编译错误,因为在这种情况下,编译器没有规则来决定是否调用{ {1}}或print(String)。有print(Integer)print(String)时它起作用的原因是String是Object的子类,因此首选print(Object)

答案 1 :(得分:2)

如果存在方法重载,编译器会搜索从最具体类型到最不具体类型的方法

来自JLS specification

  

15.12.2.5。选择最具体的方法

String相比,Object是一种更具体的类型。

答案 2 :(得分:1)

匹配方法中的最少泛型方法将由编译器选择。 即,编译器将首先发现String和Object都可以为null。然后它选择类层次结构中较低级别的那个。 (对象的级别高于String)