-2

重複の可能性:
null 引数を使用した 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 のバージョン:

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 から継承されるためです。

仕様から:

適用性テストの 3 つのフェーズのいずれかで複数の適用可能な方法が特定された場合は、最も具体的な方法が選択されます。

于 2012-12-18T20:50:10.083 に答える
1

オーバーロードされたメソッドの場合、コンパイラは 最も具体的な引数でメソッドを呼び出します。コンパイラ呼び出しの文字列を引数とするメソッド java.lang.Stringよりも具体的なクラスです。java.lang.Object

Java言語仕様から:

適用性テストの 3 つのフェーズのいずれかで複数の適用可能な方法が特定された場合は、最も具体的な方法が選択されます。

于 2012-12-18T20:50:19.690 に答える