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"); 
    }
}

指定されたコードを実行しようとすると、次の出力が得られます。

Inside String メソッド

String型パラメーターを持つメソッドが呼び出される理由を誰か説明できますか?

4

2 に答える 2

19

オーバーロードされたメソッドには、最も具体的なメソッド引数が選択されます

この場合、StringのサブクラスですObject。したがってString、より具体的になりObjectます。したがってInside String method、印刷されます。

JLS-15.12.2.5から直接

複数のメンバー メソッドがアクセス可能で、メソッド呼び出しに適用できる場合は、ランタイム メソッド ディスパッチの記述子を提供するために 1 つを選択する必要があります。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 型および boolean 型のオブジェクトへの整数型およびブール型のキャスト。

于 2016-04-26T23:23:29.753 に答える