13

私は自分のプログラムで問題に直面しており、以下の小さなコード スニペットで明確にしました。なぜこれが起こっているのか誰でも説明できますか?

class ObjectnullTest {

    public void printToOut(String string) {

        System.out.println("I am null string");
    }


    public void printToOut(Object object)

        System.out.println("I am  null object");
    }



class Test {

    public static void main(String args[]) {

        ObjectnullTest a = new ObjectnullTest();
        a.printToOut(null);

    }
}

これは常に出力しI am null stringます。

コードを修正できるように理由を知りたいです。

4

3 に答える 3

14

メソッドのオーバーロードの場合

最も具体的な方法がコンパイル時に選択されます。

「java.lang.String」は「java.lang.Object」よりも具体的なタイプです。あなたの場合、「文字列」をパラメータとして取るメソッドが選択されています。

JLSで明確に文書化されています:

2 番目の手順では、メンバー メソッドの前の手順で決定された型を検索します。このステップでは、メソッドの名前と引数式の型を使用して、アクセス可能で適用可能なメソッド、つまり、指定された引数で正しく呼び出すことができる宣言を見つけます。

そのような方法が複数ある場合があります。その場合、最も具体的な方法が選択されます。最も具体的なメソッドの記述子 (署名と戻り値の型) は、メソッドのディスパッチを実行するために実行時に使用されるものです。

于 2013-02-23T23:05:53.080 に答える
5

最も具体的な方法の選択に関する既存のコメントに同意します。キャストすることで、null を強制的にオブジェクト参照として処理し、String 引数メソッドの使用を排除できます。

a.printToOut((Object)null);
于 2013-02-23T23:22:31.370 に答える
4

選択方法の詳細については、jls のセクション 15.12.2.5 を参照してください。

最も具体的な方法がコンパイル時に選択されます

JLS 15.12.2.5 へのリンク

于 2014-12-31T04:23:53.923 に答える