Java函数中的形参默认值与可变参数
一、Java函数中的默认值
Java提供了一种方便的方法来设置函数参数的默认值。在函数定义中可以设置参数的默认值,这样即使在调用函数时没有给参数赋值,参数也将拥有默认值。形如:
void function(int a, int b = 1, int c = 2) { ... }
使用时可以给任一或全部参数传入值,例如:
function(3); function(3, 4); function(3, 4, 5);
可以看出,使用默认值既可以减少代码冗余,又方便了函数的使用。
值得注意的是,所有使用了默认值的参数必须位于函数参数列表的末尾。
二、Java函数中的可变参数
Java同样提供了可变数量的参数,使用方法与Python类似,即在函数定义时使用“...”表示可变参数。形如:
void function(int ... numbers) { ... }
使用时即可传入任意多个参数,例如:
function(1, 2, 3); function(4, 5, 6, 7); function();
可以看出,可变参数的使用省去了创建数组或List的步骤,利于代码的简单化和减少冗余。
但是需要注意的是,每个函数只能有一个可变参数列表,而且可变参数列表必须是最后一个参数。
三、Java函数中默认值与可变参数的同时使用
如果一个函数既使用了默认值,也使用了可变参数,必须按照默认值优先,可变参数放在最后的顺序进行定义。例如:
void function(int a, int b, int ... numbers) { ... }
在使用时必须按照参数顺序进行传递,例如:
function(1, 2); function(1, 2, 3, 4, 5);
打包/解包语法
使用时,必须将多个值作为一个数组传入。在Java中使用数组比较麻烦,但是Java中提供了一种打包(pack)多个参数的语法,被称为“打包语法”。
打包语法是在数组前加上“...”。
function(... new int[]{1, 2, 3});
解包语法是在函数参数前加上“...”。
function(1, 2, 3, ... numbers);
打包和解包语法可以进一步简化函数的使用。
四、Java函数中传递参数时的注意点
当使用默认值或可变参数时,传递参数的规则有一些需要注意的点。
a. 当同时存在默认值和可变参数时,必须把默认值参数放在可变参数前面传递,例如:
void function(int a, int b = 1, int ... numbers) { ... }
function(1, 2); // 相当于传递了 (int a = 1, int b = 2, int[] numbers = {})
function(1, 2, 3, 4); // 相当于传递了 (int a = 1, int b = 2, int[] numbers = {3, 4})
b. 无论默认值还是可变参数,传递的默认值或数组参数必须与函数参数类型相同,例如:
void function(String name = "no name") { ... } // 正确
void function(int ... numbers = {1, 2, 3}) { ... } // 错误,numbers参数不能是数组
c. 当函数同时具有默认值和可变参数时,如果传递参数的数量超过了定义的参数数量,则优先以默认值填充,多余的参数全部打包成一个数组参数传递进去,例如:
function(1); // 相当于传递了 (int a = 1, int b = 1, int[] numbers = {})
function(1, 2); // 相当于传递了 (int a = 1, int b = 2, int[] numbers = {})
function(1, 2, 3, 4); // 相当于传递了 (int a = 1, int b = 2, int[] numbers = {3, 4})
function(1, 2, 3, 4, 5, 6, 7); // 相当于传递了 (int a = 1, int b = 2, int[] numbers = {3, 4, 5, 6, 7})
总结
Java中的函数参数机制包含了默认值和可变参数两种方式。默认值机制可以使函数的调用更简单化;可变参数机制可以避免额外的包装操作并增加可重用性。但使用时需要遵守一些规则,以避免出现意外的错误。除了默认值和可变参数,Java还提供了打包/解包语法,能够进一步简化函数的使用。
