Java可变参数长度计算逻辑存疑:不同调用场景结果咨询
嘿,这其实是Java可变参数(varargs)的语法糖在不同调用场景下的表现差异,我给你逐个拆解:
场景1:无参数调用hello()
当你直接调用hello()不传任何参数时,Java编译器会自动帮你生成一个空的Integer[]数组(也就是new Integer[0])传递给方法。这时候方法里的x是一个实实在在的数组对象,只是长度为0,所以x.length自然输出0,不会有问题。
场景2:传递null调用hello(null)
这里的关键是null的类型匹配:因为可变参数Integer... x本质等价于Integer[] x,但null既可以被当作Integer[]类型(数组本身为null),也可以被当作单个Integer类型(然后被包装成只有一个null元素的数组)。而Java编译器在这里会优先把null直接赋值给x这个数组变量——也就是说,此时x本身就是null,不是一个数组对象。当你调用x.length时,自然会抛出空指针异常(NullPointerException)。
如果想让null被当成单个元素传入,你可以显式指定类型:hello((Integer) null),这时候编译器会把它包装成一个长度为1的数组,x.length就会输出1了。
场景3:传递已有的Integer[]数组
当你直接传递一个现成的Integer[]数组给可变参数方法时,编译器不会做额外的包装,直接把这个数组赋值给x变量。所以x就是你创建的那个长度为44的数组,调用x.length自然输出44。
总结一下核心逻辑:Java可变参数是数组的语法糖,不同的调用方式会让编译器生成不同的数组传递逻辑——无参数时生成空数组,传null时直接把数组变量设为null,传现成数组时直接复用该数组。
内容的提问来源于stack exchange,提问作者Raj

