7

私はこれを理解していないようです。

public class NewClass {
    public static void main(String[] args) {
        Object obj = null;
        myMethod(obj);
    }

    public static void myMethod(Object... objArr) {
        if(objArr != null) {
            System.out.println("I am not null");
        }
    }
}

驚いたことに、I am not nullコンソールに印刷されています。myMethod渡されたobjパラメーターが null として表示されないのはなぜですか。

4

4 に答える 4

13

メソッド シグネチャObject... objArrは、「varargs」変数を導入します。そのようなメソッドへの呼び出しで渡されるすべての引数には、その名前の配列内の独自のスロットが与えられます。

したがって、 one を渡すと、要素が だけである長さ 1nullの配列が得られます。配列自体は null ではなく、要素は null です。objArrnull

JLS、セクション 8.4.1 では、これらの「可変アリティ パラメータ」を呼び出します。

メソッドまたはコンストラクターの最後の仮パラメーターは特別です。型の後に続く省略記号で示される可変アリティ パラメーターである場合があります。

可変アリティ メソッドの呼び出しには、仮パラメータよりも多くの実引数式が含まれる場合があります。可変アリティ パラメーターの前にある仮パラメーターに対応しないすべての実引数式が評価され、結果が配列に格納され、メソッド呼び出しに渡されます (§15.12.4.2)。

(私のものを強調)

于 2013-10-02T19:00:18.013 に答える
6

のようなパラメーター リストを持つメソッドObject... objArrは、配列パラメーターを取ります。から呼び出す場合main、パラメーターは 1 つの要素を持つ配列です。1 つの要素 はobjArr[0]null になります。ただし、配列自体は null ではありません。

実際、引数なしでメソッドを呼び出しても、つまりmyMethod()配列は null にはなりません。長さ0の配列になります。

于 2013-10-02T19:00:01.900 に答える
0
if(objArr != null)
        {
            System.out.println("I am not null because I am an ARRAY object");
            System.out.println("I have " + objArr.length + " element(s)");
        }

        if(objArr[0] == null)
        {
            System.out.println("NULL");
        }

出力 ->

  I am not null because I am an ARRAY object
  I have 1 element(s)
  NULL

objArrは main (String[] args ) のargsのように動作し、objArr[1] を試行すると、objArr がほぼ配列であることを意味する例外がスローされます

于 2013-10-02T19:07:59.107 に答える