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

相关推荐
前端 贾公子2 小时前
pnpm 的 resolution-mode 配置 ( pnpm 的版本解析)
前端
free-9d2 小时前
NodeJs后端常用三方库汇总
后端·node.js
伍哥的传说3 小时前
React 自定义Hook——页面或元素滚动到底部监听 Hook
前端·react.js·前端框架
写不出来就跑路4 小时前
WebClient与HTTPInterface远程调用对比
java·开发语言·后端·spring·springboot
麦兜*4 小时前
Spring Boot 集成Reactive Web 性能优化全栈技术方案,包含底层原理、压测方法论、参数调优
java·前端·spring boot·spring·spring cloud·性能优化·maven
天上掉下来个程小白5 小时前
MybatisPlus-06.核心功能-自定义SQL
java·spring boot·后端·sql·微服务·mybatisplus
知了一笑5 小时前
独立开发第二周:构建、执行、规划
java·前端·后端
寻月隐君5 小时前
想用 Rust 开发游戏?这份超详细的入门教程请收好!
后端·rust·github
晴空月明5 小时前
分布式系统高可用性设计 - 缓存策略与数据同步机制
后端
UI前端开发工作室5 小时前
数字孪生技术为UI前端提供新视角:产品性能的实时模拟与预测
大数据·前端