2013-01-25 7 views
12

可能性の重複:私は最近戻って数日をコーディングしながら、この好奇心に出くわして、次の問題が発生した理由を把握することができないよう
Which constructor is chosen when passing null?Javaのコンストラクタに送信されるとき、「null」値は何をしますか?

考えます以下のクラス

public class RandomObject{ 
    public RandomObject(Object o){ 
     System.out.println(1); 
    } 
    public RandomObject(String[] s){ 
     System.out.println(2); 
    } 
} 

new RandomObject(null);の呼び出しを行うと、コンストラクターの作成順序に関係なく、出力は常に2になります。 nullはオブジェクトではなく文字列配列を参照するのはなぜですか?

+0

@guido他の質問には2つの非 'オブジェクト'があります。ここでは 'Object'の場合は別のものです –

答えて

14

ここで重要なのは、オブジェクトがString []

のJavaのスーパータイプであるようなケースを解決するための最も具体的な利用できる方法を使用することです。 Nullはコンパイルエラーなしで両方のメソッドに渡すことができるので、Javaはここで最も具体的なメソッドを見つけなければなりません。 String []を持つバージョンはより具体的です。したがって、実行のために選択されます。

6

Someone else has had this question earlier, check this post

から選択するには、2つのケースがある場合、コンパイラは最初のより具体的なケースを選択しようとします。この場合、StringはObjectで選択されます。それはこのよう代わりString[] s

String str

であった他の問題の

String[]

は、そのスーパータイプObjectより特定のデータ型であるため、それが取り出されます。

+0

ここでの違いは、StringではなくString []で、AnObjectではなくObjectです –

+1

@guidoこの投稿とあなたのコメントは、2つの異なるリンクについて語っています。この投稿の最初の行のリンクを読んでください –

関連する問題