当前位置: 首页 > news >正文

Java方法之可变个数形参(Varargs)学习笔记

使用场景

在调用方法时,可能会出现形参的类型是确定的,但是形参的个数是不确定的。此时,使用可变个数形参的方法。

格式

(参数类型... 参数名)

说明

  1. 可变个数形参方法的调用,针对形参的赋值个数,可以为:0个、1个或多个。
  2. 可变个数的形参方法在同一个类中,同名的多个方法之间可以构成方法的重载(类型相同的数组不构成重载)
  3. 可变个数的形参在一个方法的形参列表中只出现一次,且必须声明在形参列表的最后

代码范例

基础使用示例

public class VarargsExample {// 1. 基本可变参数方法public static void printNumbers(int... numbers) {System.out.println("接收到的数字个数: " + numbers.length);for (int num : numbers) {System.out.print(num + " ");}System.out.println();}// 2. 可变参数与固定参数结合public static void printMessageWithNumbers(String message, int... numbers) {System.out.print(message + ": ");for (int num : numbers) {System.out.print(num + " ");}System.out.println();}// 3. 零个参数的情况public static void demonstrateZeroArgs() {printNumbers(); // 不传递任何参数printMessageWithNumbers("没有数字"); // 只传递固定参数}// 4. 方法重载示例public static void processData(String... strings) {System.out.println("处理字符串数据: " + String.join(", ", strings));}public static void processData(int... numbers) {System.out.println("处理数字数据: " + Arrays.toString(numbers));}// 5. 与数组参数的区别(不能构成重载)// 以下两个方法不能同时存在,因为编译后会冲突// public static void conflictExample(String... strs) {}// public static void conflictExample(String[] strs) {} // 编译错误
}

实际应用场景示例

public class PracticalExamples {// 场景1: 日志记录 - 可以接受任意数量的日志参数public static void log(String level, String... messages) {String timestamp = LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_TIME);System.out.println("[" + timestamp + "] [" + level + "] " + String.join(" ", messages));}// 场景2: 数学计算 - 计算多个数字的和public static double sum(double... numbers) {double total = 0;for (double num : numbers) {total += num;}return total;}// 场景3: 字符串处理 - 连接多个字符串public static String concatenate(String delimiter, String... strings) {return String.join(delimiter, strings);}// 场景4: 参数验证 - 检查多个条件public static void validateArguments(String name, int age, String... requirements) {if (name == null || name.trim().isEmpty()) {throw new IllegalArgumentException("姓名不能为空");}if (age < 0 || age > 150) {throw new IllegalArgumentException("年龄无效");}for (String req : requirements) {if (req == null || req.trim().isEmpty()) {throw new IllegalArgumentException("要求参数不能为空");}}}
}

测试类展示各种调用方式

public class VarargsTest {public static void main(String[] args) {// 1. 不同数量的参数调用PracticalExamples.log("INFO", "系统启动成功");PracticalExamples.log("DEBUG", "用户登录", "用户ID: 123", "时间: 2024-01-01");PracticalExamples.log("ERROR", "数据库连接失败", "重试次数: 3");// 2. 数学计算示例System.out.println("和1: " + PracticalExamples.sum()); // 0个参数System.out.println("和2: " + PracticalExamples.sum(5)); // 1个参数System.out.println("和3: " + PracticalExamples.sum(1, 2, 3, 4, 5)); // 多个参数// 3. 字符串连接示例String result1 = PracticalExamples.concatenate(", ", "Java", "Python", "C++");String result2 = PracticalExamples.concatenate(" - ", "开始", "进行中", "结束");System.out.println("连接结果1: " + result1);System.out.println("连接结果2: " + result2);// 4. 参数验证PracticalExamples.validateArguments("张三", 25, "必须有邮箱", "必须有手机号");// 5. 方法重载调用VarargsExample.processData("Hello", "World");VarargsExample.processData(1, 2, 3, 4);// 6. 数组传递给可变参数int[] numbers = {10, 20, 30};VarargsExample.printNumbers(numbers); // 可以直接传递数组String[] messages = {"消息1", "消息2", "消息3"};PracticalExamples.log("INFO", messages); // 数组作为可变参数}
}

输出结果示例

[14:30:25.123] [INFO] 系统启动成功
[14:30:25.124] [DEBUG] 用户登录 用户ID: 123 时间: 2024-01-01
[14:30:25.125] [ERROR] 数据库连接失败 重试次数: 3
和1: 0.0
和2: 5.0
和3: 15.0
连接结果1: Java, Python, C++
连接结果2: 开始 - 进行中 - 结束
处理字符串数据: Hello, World
处理数字数据: [1, 2, 3, 4]
接收到的数字个数: 3
10 20 30 
[14:30:25.126] [INFO] 消息1 消息2 消息3

注意事项

  1. 只能有一个可变参数:一个方法中只能有一个可变参数
  2. 必须在最后:可变参数必须是方法的最后一个参数
  3. 性能考虑:频繁调用时,每次都会创建新数组,可能影响性能
  4. 与重载的配合:要小心设计重载方法,避免调用歧义

这些范例展示了可变参数在实际开发中的常见应用场景,帮助理解其灵活性和便利性。

http://www.hskmm.com/?act=detail&tid=27128

相关文章:

  • 2025 年热缩管制造厂家最新推荐排行榜:氟橡胶 / 双壁 / 线缆标识 / 防滑花纹 / DR 耐油橡胶 / PVDF / 航插用 / 军用热缩管优质企业品牌全面盘点
  • 10-9
  • 2025 建筑工程施工总包公司最新推荐榜:揭秘 5 家优质企业,以质量管控与创新实力引领行业发展
  • 2025 年板材厂家最新推荐排行榜:胖胖熊等六大优质品牌深度解析,助您选对环保、耐用、高性价比装修板材ENF级/环保/密度/净化/零醛添加/装修板材厂家推荐
  • 2025 年最新推荐:高低温 / 快速温变 / 三综合 / 淋雨 / 沙尘 / 环境 / 高低温冲击 / 高低温湿热试验箱厂家排行榜
  • 2025 年人源化小鼠公司最新推荐榜:临床前 CRO 型 / 基因人源化 / 精准医疗型 / 创新型企业综合评选 TOP 名单
  • Azure Functions Linux Consumption 托管计划退役及迁移指南
  • 完整教程:搭建nginx的负载均衡
  • 2025 年蝶阀公司最新推荐:全金属硬碰硬 / 高压 / 美标 / 双偏心等各类蝶阀优质厂家榜单及选择指南
  • 2025 年火花机厂家最新推荐榜:涵盖多类型设备,助力企业精准选购优质火花机厂家 轮胎膜专用/五轴联动/三轴联动/微细孔火花机厂家推荐
  • 详细学习 HTML5 Canvas 这一篇文章就够了
  • 2025 年国内包装印刷制造厂家最新推荐排行榜:聚焦设备、团队与服务,精选优质企业助力合作决策礼盒/定制/设计/优质/品质包装印刷厂家推荐
  • Microsoft .NET Framework 3.5,4.5,4.8 版本下载,附Microsoft Visual C++微软官方运行库下载
  • 2025 年最新工业冷水机厂家排行榜:风冷式 / 螺杆式 / 实验室等多类型冷水机优质厂家最新推荐
  • 2025 年最新推荐!国内空调机组厂家权威排行榜,含冷凝热回收等多类型机组优选指南直膨式净化/变风量/远程射流/转轮热回收/恒温恒湿空调机组厂家推荐
  • vue3使用h函数如何封装组件和$attrs和props的区别
  • 2025 年最新国际物流服务公司权威排行榜单发布,含海运快递跨境专线等领域最新推荐国际物流海运专线/国际物流专线/国际物流公司/国际物流一条龙公司推荐
  • 2025 药包材厂家最新推荐榜:含 GMP 验证 / 质量管理体系 / 实验室装修等服务优质机构盘点药包材GMP实验室/药包材GMP生产企业设备验证/药包材GMP生产质量管理体系厂家推荐
  • 低精度算术优化机器人定位效率
  • 2025 北京宽带安装公司最新推荐榜:优质服务商汇总,专业口碑双优之选,企业家庭装机必看指南北京企业/北京无线/北京商务/北京商业/北京店铺/北京商用宽带安装公司推荐
  • 2025 年供水设备源头厂家最新推荐榜:稳压给水 / 无负压供水优质企业权威解析
  • 2025 年国内优质不锈钢厂商最新推荐排行榜:含沈阳及东三省地区水箱油罐楼梯激光切割等产品服务商不锈钢水箱/油罐/水灌/油箱/楼梯/折弯厂家推荐
  • 假脱机技术
  • 2025 顶管源头厂家最新推荐榜单:F 型混凝土 / 水泥 / 电力 / 矩形 / 市政 / 排水 / 大口径顶管优质供应商精选
  • 2025 年 AI 教育机构最新推荐排行榜:涵盖企业 AI 培训、AI + 教育、AI 教育线下机构等领域的优质机构精选
  • 多智能体强化学习算法(MAPPO)
  • 《软件需求最佳实践》阅读笔记二
  • 2025 年最新台车炉实力厂家榜单发布,含大型燃气 / 天然气 / 热处理 / 全纤维等类型设备最新推荐及优质企业核心优势解析
  • Kubernetes Service详解:实现服务发现与负载均衡
  • Jmeter批量调用不同值参数的CSV