我似乎不明白这一点。
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。
答案 0 :(得分:13)
方法签名Object... objArr
引入了“varargs”变量。在对这种方法的调用中传递的每个参数都在该名称的数组中给出了自己的插槽。
因此,当您传递一个null
时,您将获得长度为1的数组objArr
,其唯一元素为null
。数组本身不为null,元素为。
JLS, Section 8.4.1调用这些“变量arity参数”:
方法或构造函数的最后一个形式参数是特殊的:它 可以是变量arity参数,由下面的省略号表示 类型。
和
变量arity方法的调用可能包含更多实际值 参数表达式比形式参数。所有的实际论点 表达式与前面的形式参数不对应 将评估变量arity参数并存储结果 到数组,将传递给方法调用 (§15.12.4.2)。
(强调我的)
答案 1 :(得分:6)
具有类似Object... objArr
的参数列表的方法采用数组参数。当您从main
调用它时,参数是一个包含一个元素的数组。一个元素objArr[0]
将为null。但是数组本身并不是空的。
实际上,即使您调用没有参数的方法,即myMethod()
,该数组仍然不为空。它将是一个长度为0的数组。
答案 2 :(得分:0)
数组objArr
不会为null,如果您在调用此函数时从obj
传递一个参数main
。 obj
为null,但数组包含此null元素,这意味着数组的大小为1,并且不为null。
答案 3 :(得分: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");
}
OUTPUT - >
I am not null because I am an ARRAY object
I have 1 element(s)
NULL
objArr 在main(String [] args )中的行为类似 args 如果你尝试objArr [1]它将抛出异常意味着objArr几乎是一个数组