-2

可能重复:
带有空参数的 Java 方法分派

为什么这会打印“a(String)”?

public class Test{
    public static void main(String[] args){
        a(null);
    }
    public static void a(Object x){
        System.out.println("a(Object)");
    }
    public static void a(String x){
        System.out.println("a(String)");
    }
    public static void a(int x){
        System.out.println("a(int)");
    }
    public static void a(){
        System.out.println("a()");
    }
}

爪哇版:

java version "1.7.0_04-ea"
Java(TM) SE Runtime Environment (build 1.7.0_04-ea-b228)
Java HotSpot(TM) 64-Bit Server VM (build 23.0-b12, mixed mode)
4

2 回答 2

2

因为规则是选择最具体的方法,而 String 继承自 Object。

从规范:

如果在适用性测试的三个阶段之一中确定了几种适用的方法,则选择最具体的一种

于 2012-12-18T20:50:10.083 回答
1

在重载方法的情况下,编译器使用 最具体的参数调用方法。与以字符串为参数的方法相比,编译器调用 java.lang.String具体的类。java.lang.Object

来自Java 语言规范:

如果在适用性测试的三个阶段之一中确定了几种适用的方法,则选择最具体的一种

于 2012-12-18T20:50:19.690 回答