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,可以编写更灵活易用的方法,省去很多重复编写数组实例的麻烦,也让方法调用更加简洁明了。

相关推荐
江拥羡橙3 小时前
Vue和React怎么选?全面比对
前端·vue.js·react.js
Pr Young3 小时前
服务优雅停止和服务优雅启动
后端
嘟嘟MD4 小时前
程序员副业 | 2025年9月复盘
后端·aigc
楼田莉子4 小时前
Qt开发学习——QtCreator深度介绍/程序运行/开发规范/对象树
开发语言·前端·c++·qt·学习
暮之沧蓝4 小时前
Vue总结
前端·javascript·vue.js
尘觉4 小时前
中秋节与 Spring Boot 的思考:一场开箱即用的团圆盛宴
java·spring boot·后端
木易 士心5 小时前
Promise深度解析:前端异步编程的核心
前端·javascript
间彧5 小时前
Seata分布式事务框架详解与项目实战
后端
zhuyasen5 小时前
单机已达上限?PerfTest 分布式压测登场,轻松模拟百万用户洪峰
后端·性能优化·测试
im_AMBER5 小时前
Web 开发 21
前端·学习