ホームページ >Java >&#&チュートリアル >Java でオーバーロードされたメソッドに「null」を渡すと、「String」パラメータを持つメソッドが呼び出されるのはなぜですか?
メソッドのオーバーロードと Null パラメーターの選択
Java では、メソッドがオーバーロードされると、同じ名前で異なるパラメーター リストを持つ複数のメソッドが存在します。 。メソッドの呼び出しが行われるとき、コンパイラは、渡された実際の引数の数と型に基づいて、どのオーバーロードされたメソッドを呼び出すかを決定します。
次のコード スニペットを考えてみましょう。
public class MoneyCalc { public void method(Object o) { System.out.println("Object Verion"); } public void method(String s) { System.out.println("String Version"); } public static void main(String args[]) { MoneyCalc question = new MoneyCalc(); question.method(null); } }
質問:オーバーロードされたメソッドに null 値を渡すと、メソッド (String) バージョンが呼び出されるのはなぜですか?
回答:
Java では、null は存在しないオブジェクトへの参照を表す特別な定数値。これは特定の型の値ではありませんが、Object や String を含む任意の参照型の変数に割り当てることができます。
引数として null を使用してメソッド呼び出しが行われる場合、コンパイラはMethod(String) バージョンは、method(Object) バージョンよりも具体的であるためです。 Java 言語仕様 (JLS) によれば、最も具体的なオーバーロードは、その適用性と特異性に基づいて選択されます。
適用性とは、コンパイル時エラーなしで引数をメソッドに渡すことができるかどうかを指します。この場合、null は Object 型と String 型の両方の変数に割り当てることができるため、両方のメソッドに適用できます。
特異性は、指定された引数に対してメソッドがどの程度特殊化されているかを測定します。この場合、method(String) オーバーロードは String 型の引数のみを処理するように設計されているため、より具体的になります。 Method(Object) オーバーロードは、Object 型またはそのサブクラスの引数を処理できるため、より一般的です。
したがって、コンパイラは、より具体的で提供されたメソッドに適用できるメソッド (String) バージョンを選択します。引数は null 参照です。
注: パラメーターの型として StringBuffer を持つ 2 番目のオーバーロードされたメソッドが MoneyCalc クラスに追加されると、コンパイル エラーが発生します。これは、この場合、method(String) とmethod(StringBuffer) のどちらも他方より具体的ではないため、メソッドの選択が曖昧になるためです。
以上がJava でオーバーロードされたメソッドに「null」を渡すと、「String」パラメータを持つメソッドが呼び出されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。