一、可变参数
1、介绍
Java的可变参数(Varargs)是一种语法特性,允许一个方法接受不定数量的参数。可变参数的使用通过在参数类型后面添加省略号(...
)实现。这使得方法在调用时可以传入不同数量的参数,而不需要为每种情况分别定义方法。
2、具体语法
可变参数的具体语法:
返回类型 方法名(参数类型... 参数名) {
// 方法体
}
3、内部具体原理
在方法内部,可变参数实际上被当作一个数组来处理。如果你定义了一个可变参数类型为int...
,在方法内部它将被视为一个int[]
数组。因此,你可以使用数组的方式来遍历和操作这些参数。
class Calculator {
//可以传入任意个int参数的加法方法
public int sum(int... nums) {
int sum = 0;
for(int i = 0; i < nums.length; i++) {
sum += nums[i];
}
return sum;
}
}
4、可变参数的规则和注意事项
1)一个方法只能有一个可变参数:
public void method(int... numbers, String... strings) {
// 编译错误
}
2)可变参数可以与其他参数一起使用,但可变参数必须是方法的最后一个参数:
public void method(String str, int... numbers) {
// 合法
}
public void method(int... numbers, String str) {
// 编译错误
}
4)传入数组也可以匹配可变参数:
也就是说当我们的一个方法的参数中有可变参数时,当我们在调用这个方法时,传入了一个数组,这个数组的内容就可以与可变参数匹配。
public class Test {
public static void main(String[] args) {
Calculator myCalculator = new Calculator();
int[] arr = {1, 2, 3};
int res = myCalculator.sum(arr);
System.out.println(res);
}
}
class Calculator {
//可以传入任意个int参数的加法方法
public int sum(int... nums) {
int sum = 0;
for(int i = 0; i < nums.length; i++) {
sum += nums[i];
}
return sum;
}
}
运行结果:
但是如果要以数组为参数传入的话则只能给这个可变参数传入这个数组,不能再传入其他整型。例如下面就是错的:
对于这个可变参数只能传入一个数组。
二、可变参数使用
1、计算多个int型数据的乘积
public class Test {
public static void main(String[] args) {
Calculator myCalculator = new Calculator();
int res = myCalculator.getProduct(1, 2, 3);
System.out.println("result of 1 * 2 * 3 = " + res);
}
}
class Calculator {
//可变参数
public int getProduct(int... nums) {
int product = 1;
for(int i = 0; i < nums.length; i++) {
product *= nums[i];
}
return product;
}
}
运行结果:
2、Java 中的 printf 方法
是的,Java中的printf
方法使用了可变参数。printf
方法是PrintStream
类的一部分,通常通过System.out
调用,用于格式化输出。以下是printf
方法的一个常见签名:
public PrintStream printf(String format, Object... args)
后面就是可变参数,它的可变参数也是遵循上面的规则的。
我们在使用 printf 方法时,可以传入不同数目个变量,然后通过最前面的字符串格式化打印后面的变量的值。
public class Main {
public static void main(String[] args) {
int age = 25;
String name = "Alice";
double score = 95.5;
System.out.printf("Name: %s, Age: %d, Score: %.2f%n", name, age, score);
System.out.printf("Name: %s, Age: %d", name, age);
}
}
可以发现这里可以传入不同数目的参数。
具体实现就是通过可变参数。
在Java中,printf
方法的可变参数使用的是Object... args
,这意味着你可以传入任意数量的参数,这些参数的类型可以是任何对象类型或者其子类。因为所有类型在Java中最终都继承自Object
类,所以可以传入不同类型的参数。
Java中的所有类都继承自Object
类,因此任何类型的对象都可以作为Object
类型的参数传递。这是Java的继承和多态性特性。基本数据类型(如int
、double
等)在需要的时候会自动装箱为其对应的包装类(如Integer
、Double
等)。这些包装类都继承自Object
,所以也可以作为参数传递。