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

Java 可变参数(Varargs)使用指南

文章目录

      • **Java 可变参数(Varargs)使用指南**
        • **1. 基本语法**
        • **2. 调用方式**
        • **3. 关键注意事项**
        • **4. 底层实现**
        • **5. 实际应用场景**
        • **6. 总结**

Java 可变参数(Varargs)使用指南


1. 基本语法
  • 定义方式:在方法参数中使用 类型... 参数名,且必须是最后一个参数。
  • 示例
public void printValues(String prefix, int... numbers) {
    System.out.print(prefix + ": ");
    for (int num : numbers) {
        System.out.print(num + " ");
    }
    System.out.println();
}

2. 调用方式
调用方式示例输出
传递多个值printValues("结果", 1, 2, 3);结果: 1 2 3
传递数组int[] arr = {4, 5, 6}; printValues("数组", arr);数组: 4 5 6
空参数printValues("空");空: (无数字)

3. 关键注意事项
  1. 参数位置
    • 可变参数必须为最后一个参数,否则编译错误。
    • ❌ 错误示例:
public void errorExample(int... nums, String str) {} // 编译错误
  1. 方法重载优先级
    • 固定参数方法优先于可变参数方法:
void test(int a, int b) {}    // 优先调用
void test(int... nums) {}     // 参数不匹配时调用
    * `test(1, 2)` → 调用第一个方法。  
    * `test(1)` → 调用第二个方法。
  1. 避免重载歧义
    • 两个可变参数方法会导致编译错误:
void test(int... nums) {}
void test(String... strs) {}
test(); // 编译错误:无法确定调用哪个方法
  1. 处理 null
  • 情况 1:可变参数本身为 <font style="color:rgb(64, 64, 64);">null</font>
printValues(null, 1, 2);  // 第一个参数是 prefix,被赋值为 null
- **<font style="color:rgb(64, 64, 64);">风险</font>**<font style="color:rgb(64, 64, 64);">:若方法内直接使用 </font>`<font style="color:rgb(64, 64, 64);">prefix</font>`<font style="color:rgb(64, 64, 64);">(如 </font>`<font style="color:rgb(64, 64, 64);">prefix.length()</font>`<font style="color:rgb(64, 64, 64);">),会抛出 </font>`<font style="color:rgb(64, 64, 64);">NullPointerException</font>`<font style="color:rgb(64, 64, 64);">。</font>
  • 情况 2:可变参数数组为 <font style="color:rgb(64, 64, 64);">null</font>
int[] nums = null;
printValues("前缀", nums);  // 可变参数 numbers 接收 null
- **<font style="color:rgb(64, 64, 64);">风险</font>**<font style="color:rgb(64, 64, 64);">:遍历 </font>`<font style="color:rgb(64, 64, 64);">numbers</font>`<font style="color:rgb(64, 64, 64);"> 时(如 </font>`<font style="color:rgb(64, 64, 64);">for (int num : numbers)</font>`<font style="color:rgb(64, 64, 64);">),会抛出 </font>`<font style="color:rgb(64, 64, 64);">NullPointerException</font>`<font style="color:rgb(64, 64, 64);">。</font>
  • 直接传递 null 可能引发 NullPointerException,建议检查:
prefix = (prefix == null) ? "默认前缀" : prefix;
//或者
if (numbers == null) {
        numbers = new int[0];  // 替换为空数组
    }

4. 底层实现
  • 可变参数在编译后会转换为数组:
// 源码
void sum(int... nums) {}

// 编译后等价于
void sum(int[] nums) {}

5. 实际应用场景
  1. 日志工具类
public class Logger {
    public static void log(String format, Object... args) {
        format = format == null ? "[无消息]" : format;
        args = args == null ? new Object[0] : args;
        String message = String.format(format, args);
        System.out.println(message);
    }
}

// 调用示例
Logger.log(null, "Alice");          // 输出: [无消息]
Logger.log("用户: %s", null);       // 输出: 用户: null
Logger.log("数据: %d", (Object)null); // 输出: 数据: null
  1. 数学计算
public static int max(int... numbers) {
    if (numbers == null || numbers.length == 0) {
        throw new IllegalArgumentException("参数不能为null或空");
    }
    int max = numbers[0];
    for (int num : numbers) {
        if (num > max) max = num;
    }
    return max;
}

// 调用示例
max(1, 3, 2);     // 正常返回 3
max(null);        // 抛出 IllegalArgumentException

6. 总结
优点注意事项适用场景
简化调用,参数数量灵活必须作为最后一个参数日志、工具方法、参数数量不确定时
代码更简洁避免重载歧义String.format()、集合操作
兼容数组传参处理 null 值防崩溃

核心原则

  • 可变参数提供灵活性,但需谨慎设计方法签名以避免冲突。
  • 适合同类型参数数量不确定的场景。

参考:博客园

http://www.dtcms.com/a/109887.html

相关文章:

  • Vue实例中,setTimeout()不生效怎么解决
  • 联合类型|类型断言|交叉类型
  • [CISSP] [6] 密码学和对称密钥算法
  • AI模拟了一场5亿年的进化
  • 微信小程序基于Canvas实现头像图片裁剪(上)
  • 【python】Plot a Square
  • 【SQL】取消sql某一列的唯一值key值的方法
  • XXX软件系统研发技术手册模板
  • “*(单星号)”和“**(双星号)”在Python中的灵活运用
  • PySide6控件:QFont设置、QColor调色板、QPixmap图像处理与QCursor光标自定义
  • ESP32 C3mini与ESP32-WROOM蓝牙连接问题
  • 离线模型添加联网搜索功能
  • hpu萌新训练赛(三)
  • NVR接入录像回放平台EasyCVR打造基层安防 “智慧中枢”:一站式智慧安防方案
  • 使用 Mockito 快速构建 Mock 测试环境
  • uniapp如何接入星火大模型
  • php的高速缓存
  • SparkAudio 是什么,和其他的同类 TTS 模型相比有什么优势
  • Redis缓存问题
  • Linux系统程序设计:从入门到高级Day02
  • CAD插入属性块 弹窗提示输入属性值——CAD知识讲堂
  • 【Linux】线程同步
  • 深入理解C++多态
  • 4.3python操作ppt
  • LabVIEW提升程序响应速度
  • node-modules-inspector 可视化node_modules
  • docker-compose部署以及常用命令
  • 解决 Hugging Face SentenceTransformer 下载失败的完整指南:ProxyError、SSLError与手动下载方案
  • 【通俗易懂说模型】生成对抗网络·GAN
  • 二语习得理论(Second Language Acquisition, SLA)如何学习英语