我好像不明白这一点.
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");
}
}
}
Run Code Online (Sandbox Code Playgroud)
令我惊讶的I am not null是,打印在控制台上.为什么myMethod没有将传递的obj参数视为null.
rge*_*man 13
方法签名Object... objArr引入了"varargs"变量.在对这种方法的调用中传递的每个参数都在该名称的数组中给出了自己的插槽.
因此,当您传递一个时null,您将得到一个objArr长度为1 的数组,其唯一的元素是null.数组本身不是null,元素是.
在JLS,第8.4.1节称这些"变量参数数量参数":
方法或构造函数的最后一个形式参数是特殊的:它可以是一个变量arity参数,由类型后面的省略号表示.
和
变量arity方法的调用可能包含比形式参数更多的实际参数表达式.将评估与变量arity参数之前的形式参数不对应的所有实际参数表达式,并将结果存储到将传递给方法调用的数组中(第15.12.4.2节).
(强调我的)
带参数列表的方法就像Object... objArr一个数组参数.从中调用它时main,参数是一个包含一个元素的数组.one元素objArr[0]将为null.但是数组本身并不是空的.
实际上,即使您调用没有参数的方法,即myMethod()数组仍然不为null.它将是一个长度为0的数组.
| 归档时间: |
|
| 查看次数: |
211 次 |
| 最近记录: |