【问题标题】:Java Overloading concept [duplicate]Java重载概念[重复]
【发布时间】:2013-03-06 12:28:45
【问题描述】:

当我运行这段代码时,它会打印出String。我的问题是为什么没有编译时错误? Object 和 String 的默认值为 null。那为什么编译器不说Reference to method1 is ambiguous

public class Test11
{

   public static void method1(Object obj) {
      System.out.println("Object");
   }

   public static void method1(String str) {
      System.out.println("String");
   }

   public static void main(String[] arr ) {
      method1(null);    
   }
}

【问题讨论】:

标签: java overloading


【解决方案1】:

来自this answer

在那里,您会注意到这是一个编译时任务。 JLS 在第 15.12.2 小节中说:

此步骤使用方法的名称和参数表达式的类型来定位既可访问又适用的方法可能有多个这样的方法,在这种情况下选择最具体的一个强>。

【讨论】:

  • 非常感谢您清除我的概念
【解决方案2】:

编译器将查看可能与您传递的参数匹配的方法的所有可能重载。如果其中一个比 all 其他的更具体,那么它将被选中,只有在没有单个 most specific 重载时才会被认为是模棱两可的。

在您的示例中,有两个可能的重载,method1(Object)method1(String)。由于StringObject 更具体,因此没有歧义,因此将选择String 选项。如果存在第三个重载,例如 method1(Integer),则调用 method1(null) 将不再有一个最具体的选择,编译器将生成错误。

【讨论】:

  • +1 用于指出错误场景。
  • 非常感谢您的回复
【解决方案3】:

一句话就完事了

在重载方法的情况下,编译器选择最多的方法 特定类型,因为 String 是 Object 编译器中最特定的类型 将调用以字符串为参数的方法

【讨论】:

  • 非常感谢......现在我明白为什么调用 String 了。
  • @user2139744 不客气 :)
【解决方案4】:
public class Test11
{
public static void method1(String str)//here str is the object of string
{

System.out.println("String");
}

public static void method1(Object obj)//here this is a common object not specified
{
System.out.println("Object");
}



public static void main(String[] arr )
{
    Test11 t=new Test11();
    String null1=new String();
    method1(null1);  
    method1(t);  
}

}

output is :
String
Object

//null1- 是一个字符串对象,如果你传递它,它只会调用 method1(String str),因为你传递了字符串对象 //t-是一般对象,如果你传递这个它会调用method1(Object obj),因为你传递了类objct,所以它会把对象作为参数传递

【讨论】:

  • 非常感谢您的回复
猜你喜欢
  • 2016-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-20
相关资源
最近更新 更多