重载方法如何工作?

时间:2013-10-08 09:18:35

标签: java overloading

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类型参数的方法?

2 个答案:

答案 0 :(得分:19)

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

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

直接来自JLS-15.12.2.5

  

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

由于BMT和LastFreeNickName已正确建议,(Object)null将导致调用带有Object类型方法的重载方法。

答案 1 :(得分:0)

添加到现有的回复,我不确定这是否是因为问题以来的新Java版本,但是当我尝试使用将Integer作为参数而不是Object的方法编译代码时,代码仍然编译。但是,以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被归类为String对象。

回到问题,只有在创建新对象时才会遇到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类型的对象和布尔值。