写代码的时候接触到了Java可变参数,顺便断点调试观察了一下表现,有个别地方确实有些意外。
虽然用起来不难,但是趁机想彻底了解这个语言特性,在此总结一下。
可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理。
注意:可变参数必须位于最后一项。
工具类代码:
public class ParamCheckUtil3 {
/**
* 所有都为null
*/
public static boolean allNull(Object param1, Object... params) {
if (param1 != null) {
return false;
}
if (params == null) {
return true;
}
for (Object param : params) {
if (param != null) {
return false;
}
}
return true;
}
/**
* 所有都不为null
*/
public static boolean allNotNull(Object param1, Object... params) {
if (param1 == null) {
return false;
}
if (params == null) {
return false;
}
for (Object param : params) {
if (param == null) {
return false;
}
}
return true;
}
}
那么想到了几个问题:
1、 为啥第一个参数要单独写?
之前也看到过可变参数的前面还写同类型参数的情况,这种情况是因为必须有一个以上的参数。
2、当调用时只传一个参数效果是啥样?
Assert.assertTrue(ParamCheckUtil3.allNull(null));
3、当调用时传两个参数,第二个是null效果是啥样?
Assert.assertTrue(ParamCheckUtil3.allNull(null, null));
这里可变参数并不是一个只含有null的单个元素的数组,而是null。
如果第二个不是null呢?
Assert.assertFalse(ParamCheckUtil3.allNull(null, 2));
发现是含有一个元素的数组。
如果更多参数,则可变参数依然是数组。
可变参数的核心是将参数封装为数组,但是传入null时并不是只含有一个null元素的数组,而是null。
可变参数方便调用者传入不数量的参数且不需要在前面非常不优雅的构造数组对象。
我们开发过程中正确接触到某块知识,可以进源码去看源码怎么写的,也可以写demo去断点研究下表现。
这样才能提高的更快,否则永远只是会用,永远只是知道最常用的,看啥都觉得简单,但是学啥都不太深入,讨论问的的时候或者面试的时候问的稍微深点就不会了。
总之学习是一种态度,学习是一种能力,带着一颗学习研究的心态,不忘初心,砥砺前行。