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

相关推荐
uzong16 分钟前
技术故障复盘模版
后端
GetcharZp44 分钟前
基于 Dify + 通义千问的多模态大模型 搭建发票识别 Agent
后端·llm·agent
加班是不可能的,除非双倍日工资1 小时前
css预编译器实现星空背景图
前端·css·vue3
桦说编程1 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
IT毕设实战小研1 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
wyiyiyi2 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
gnip2 小时前
vite和webpack打包结构控制
前端·javascript
excel2 小时前
在二维 Canvas 中模拟三角形绕 X、Y 轴旋转
前端
阿华的代码王国3 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
一条上岸小咸鱼3 小时前
Kotlin 基本数据类型(三):Booleans、Characters
android·前端·kotlin