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

相关推荐
UI设计和前端开发从业者10 分钟前
从UI前端到数字孪生:构建数据驱动的智能生态系统
前端·ui
Junerver1 小时前
Kotlin 2.1.0的新改进带来哪些改变
前端·kotlin
千百元2 小时前
jenkins打包问题jar问题
前端
喝拿铁写前端2 小时前
前端批量校验还能这么写?函数式校验器组合太香了!
前端·javascript·架构
巴巴_羊2 小时前
6-16阿里前端面试记录
前端·面试·职场和发展
我是若尘2 小时前
前端遇到接口批量异常导致 Toast 弹窗轰炸该如何处理?
前端
该用户已不存在2 小时前
8个Docker的最佳替代方案,重塑你的开发工作流
前端·后端·docker
然我2 小时前
面试官最爱的 “考试思维”:用闭包秒杀递归难题 🚀
前端·javascript·面试
lizhongxuan2 小时前
groupcache 工作原理
后端
明月与玄武2 小时前
HTML知识全解析:从入门到精通的前端指南(上)
前端·html