51. Java 类和对象 - 任意数量的参数
在 Java
中,如果你不确定方法需要接收多少个同类型的参数,或者方法可以处理可变长度的参数列表,就可以使用可变参数(varargs
)。这不仅简化了方法的声明,也让调用方法时可以传递任意数量的该类型参数,而无需显式创建数组。✅
🚀 1. 语法
可变参数 的语法是在最后一个参数的类型 后面加上三个点( ...
),然后是参数名。例如:
java
public Polygon polygonFrom(Point... corners) {
// 方法体
}
Point... corners
表明corners
是一个可变参数,可以传递多个Point
对象(也可以不传),在方法体内被视为Point[]
数组来使用。
🎯 要点
- 可变参数必须是方法参数列表中最后一个参数(否则编译报错)。
- 一个方法只能有一个 可变参数;不能同时声明多个
varargs
。 - 在方法体内部,可变参数可以被当做数组来使用。例如
corners.length
获取其长度。
🌟 2. 调用方式
在调用带有 varargs
的方法时,可以:
- 按多个实参传递(不需要数组),方法调用时自动打包成数组。
- 直接传递一个数组(如果已经有一个现成的数组)。
示例 1:传递多个 Point
实参
java
Polygon poly = polygonFrom(new Point(0,0),
new Point(10,0),
new Point(10,10),
new Point(0,10));
此时,编译器会自动将这 4 个 Point
实例打包为一个 Point[]
数组传递给 polygonFrom()
方法。
示例 2:传递一个现有数组
java
Point[] corners = { new Point(0,0),
new Point(10,0),
new Point(10,10) };
Polygon poly = polygonFrom(corners);
此时,corners
数组会被直接用作可变参数的输入。
🏹 3. 示例代码:polygonFrom(Point... corners)
下面的示例说明了如何在方法体中使用 corners
。它可以被看作一个数组:
java
public Polygon polygonFrom(Point... corners) {
int numberOfSides = corners.length;
if (numberOfSides < 2) {
// 不够点来画多边形
return null;
}
// 计算第一条边的长度
double squareOfSide1 = (corners[1].x - corners[0].x)
* (corners[1].x - corners[0].x)
+ (corners[1].y - corners[0].y)
* (corners[1].y - corners[0].y);
double lengthOfSide1 = Math.sqrt(squareOfSide1);
System.out.println("Length of side 1: " + lengthOfSide1);
// 此处省略创建多边形的其他逻辑
Polygon polygon = new Polygon();
// ...
return polygon;
}
在这里,corners
与 Point[] corners
使用方式类似,比如可以用 corners.length
获取元素数量,用 corners[i]
访问每个点。
📚 4. 常见用途:打印方法
Java
标准库中许多方法都使用 varargs
。例如 System.out.printf(String format, Object... args)
,它允许你在格式字符串 format
中引用任意数量的 args
:
java
System.out.printf("%s: %d, %s%n", name, idnum, address);
System.out.printf("%s: %d, %s, %s, %s%n", name, idnum, address, phone, email);
无论 args
有几个参数,printf
都能处理;实参会被打包成一个 Object[]
数组。
⚠️ 5. 注意事项
- 只能有一个可变参数 :且必须是参数列表的最后一个。如
foo(int a, String b, Point... points)
。 - 可能影响性能:每次调用可变参数方法都要创建数组,若在高频率调用且数据量大时,需注意性能开销。
- 语义清晰 :只有当确实需要可变数量的相同类型参数时才使用
varargs
,否则可能导致方法调用可读性下降。
✅ 6. 小结
varargs
允许在方法和构造函数中传递任意数量的同类型实参,类似一个数组,但无需显式构造数组。- 语法 :
public void methodName(Type... varargs) { ... }
- 可以同时 使用多个参数与可变参数,但可变参数必须是最后一个。
- 最常见的示例之一就是
System.out.printf(...)
,可以接收任意数量的对象参数以满足字符串格式化需求。
通过使用 varargs
,可以编写更灵活易用的方法,省去很多重复编写数组实例的麻烦,也让方法调用更加简洁明了。