9
public class Test1  {

    public static void main(String[] args)   {
        Test1 test1 = new Test1();
        test1.testMethod(null);
    }

    public void testMethod(String s){
        System.out.println("Inside String Method");     
    }

    public void testMethod(Object o){
        System.out.println("Inside Object Method"); 
    }
}

当我尝试运行给定的代码时,我得到以下输出:

内部字符串方法

谁能解释为什么String调用带有类型参数的方法?

4

2 回答 2

19

为重载方法选择最具体的方法参数

在这种情况下,String是 的子类Object。因此String变得比 更具体Object。因此Inside String method被打印出来。

直接来自JLS-15.12.2.5

如果多个成员方法既可访问又适用于方法调用,则有必要选择一个为运行时方法分派提供描述符。Java 编程语言使用选择最具体方法的规则。

正如 BMT 和 LastFreeNickName 正确建议的那样,将导致调用具有类型方法的(Object)null重载方法。Object

于 2013-10-08T09:20:45.773 回答
0

添加到现有回复中,我不确定这是否是因为自问题以来的 Java 版本较新,但是当我尝试使用将整数作为参数而不是对象的方法编译代码时,代码仍然确实编译了。但是,以 null 为参数的调用在运行时仍然调用了 String 参数方法。

例如,

public void testMethod(int i){
    System.out.println("Inside int Method");     
}

public void testMethod(String s){
    System.out.println("Inside String Method");     
}

仍然会给出输出:

Inside String Method

当被称为:

test1.testMethod(null);

主要原因是因为 String 确实接受 null 作为值而 int 不接受。所以 null 被归类为字符串对象。

回到所问的问题,Object 类型仅在创建新对象时才会遇到。这是通过将 null 类型转换为 Object 来完成的

test1.testMethod((Object) null);

或将任何类型的对象用于原始数据类型,例如

test1.testMethod((Integer) null);
    or
test1.testMethod((Boolean) null);

或者通过简单地创建一个新对象

test1.testMethod(new  Test1());

应当指出的是

test1.testMethod((String) null);

将再次调用 String 方法,因为这将创建一个 String 类型的对象。

还,

test1.testMethod((int) null);
    and
test1.testMethod((boolean) null);

将给出编译时错误,因为 boolean 和 int 不接受 null 作为有效值以及 int!=Integer 和 boolean!=Boolean。整数和布尔类型转换为 int 和布尔类型的对象。

于 2016-04-26T23:23:29.753 回答