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参数为空。

4

4 回答 4

13

方法签名Object... objArr引入了一个“varargs”变量。在调用此类方法时传递的每个参数在该名称的数组中都有自己的插槽。

因此,当您传递一个时null,您会得到一个长度为 1 的数组objArr,其唯一元素是null。数组本身不是空的,元素是。

JLS,第8.4.1 节称这些“可变参数”:

方法或构造函数的最后一个形式参数是特殊的:它可能是一个可变参数,由类型后面的省略号表示。

变量 arity 方法的调用可能包含比形式参数更多的实际参数表达式。所有与变量 arity 参数之前的形式参数不对应的实际参数表达式都将被评估,并将结果存储到一个数组中,该数组将传递给方法调用(第 15.12.4.2 节)。

(强调我的)

于 2013-10-02T19:00:18.013 回答
6

具有参数列表的方法(如Object... objArr采用数组参数)。当您从 调用它时main,参数是一个包含一个元素的数组。一个元素 ,objArr[0]将为空。但数组本身不为空。

事实上,即使你调用不带参数的方法,即myMethod(),数组仍然不为空。它将是一个长度为 0 的数组。

于 2013-10-02T19:00:01.900 回答
0

该数组objArr不会为空,因为您在调用此函数时传递了一个参数obj。为空,但数组包含这个空元素,这意味着数组的大小为 1,并且不为空。mainobj

于 2013-10-02T19:02:20.207 回答
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 回答