51. Java 类和对象 - 任意数量的参数

51. Java 类和对象 - 任意数量的参数

Java 中,如果你不确定方法需要接收多少个同类型的参数,或者方法可以处理可变长度的参数列表,就可以使用可变参数(varargs。这不仅简化了方法的声明,也让调用方法时可以传递任意数量的该类型参数,而无需显式创建数组。✅

🚀 1. 语法

可变参数 的语法是在最后一个参数的类型 后面加上三个点( ...,然后是参数名。例如:

java 复制代码
public Polygon polygonFrom(Point... corners) {
    // 方法体
}
  • Point... corners 表明 corners 是一个可变参数,可以传递多个 Point 对象(也可以不传),在方法体内被视为 Point[] 数组来使用。

🎯 要点

  1. 可变参数必须是方法参数列表中最后一个参数(否则编译报错)。
  2. 一个方法只能有一个 可变参数;不能同时声明多个 varargs
  3. 在方法体内部,可变参数可以被当做数组来使用。例如 corners.length 获取其长度。

🌟 2. 调用方式

在调用带有 varargs 的方法时,可以:

  1. 按多个实参传递(不需要数组),方法调用时自动打包成数组。
  2. 直接传递一个数组(如果已经有一个现成的数组)。

示例 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;
}

在这里,cornersPoint[] 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. 注意事项

  1. 只能有一个可变参数 :且必须是参数列表的最后一个。如 foo(int a, String b, Point... points)
  2. 可能影响性能:每次调用可变参数方法都要创建数组,若在高频率调用且数据量大时,需注意性能开销。
  3. 语义清晰 :只有当确实需要可变数量的相同类型参数时才使用 varargs,否则可能导致方法调用可读性下降。

✅ 6. 小结

  • varargs 允许在方法和构造函数中传递任意数量的同类型实参,类似一个数组,但无需显式构造数组。
  • 语法public void methodName(Type... varargs) { ... }
  • 可以同时 使用多个参数与可变参数,但可变参数必须是最后一个
  • 最常见的示例之一就是 System.out.printf(...),可以接收任意数量的对象参数以满足字符串格式化需求。

通过使用 varargs,可以编写更灵活易用的方法,省去很多重复编写数组实例的麻烦,也让方法调用更加简洁明了。

相关推荐
Aliex_git9 小时前
跨域请求笔记
前端·网络·笔记·学习
李日灐9 小时前
C++进阶必备:红黑树从 0 到 1: 手撕底层,带你搞懂平衡二叉树的平衡逻辑与黑高检验
开发语言·数据结构·c++·后端·面试·红黑树·自平衡二叉搜索树
37方寸9 小时前
前端基础知识(Node.js)
前端·node.js
powerfulhell9 小时前
寒假python作业5
java·前端·python
qq_2975746710 小时前
【实战】POI 实现 Excel 多级表头导出(含合并单元格完整方案)
java·spring boot·后端·excel
木子啊10 小时前
前端组件化:模板继承拯救发际线
前端
三十_A10 小时前
零基础通过 Vue 3 实现前端视频录制 —— 从原理到实战
前端·vue.js·音视频
前端小菜袅10 小时前
PC端原样显示移动端页面方案
开发语言·前端·javascript·postcss·px-to-viewport·移动端适配pc端
We་ct10 小时前
LeetCode 228. 汇总区间:解题思路+代码详解
前端·算法·leetcode·typescript
郝学胜-神的一滴10 小时前
超越Spring的Summer(一): PackageScanner 类实现原理详解
java·服务器·开发语言·后端·spring·软件构建