java可变参数

在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) {}

(2) 方法重载的优先级

固定参数方法优先于可变参数方法:

public void test(int a, int b) {}       // 优先调用
public void test(int... nums) {}        // 参数数量不匹配时调用

test(1, 2);   // 调用第一个方法
test(1);      // 调用第二个方法

(3) 避免重载歧义

两个可变参数方法可能导致编译错误:

public void test(int... nums) {}
public void test(String... strs) {} 

test(); // 编译错误:无法确定调用哪个方法

(4) 处理null

直接传递null可能导致空指针异常:

printValues(null, 1, 2); // prefix为null,可能抛出NullPointerException

建议在方法内检查:

public void printValues(String prefix, int... numbers) {
    prefix = (prefix == null) ? "默认前缀" : prefix;
    // 其他逻辑...
}

4. 底层实现

可变参数在编译后会被转换为数组:

// 源码
public static void sum(int... nums) {}

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

5. 实际应用场景

(1) 日志工具类

public class Logger {
    public static void log(String format, Object... args) {
        String message = String.format(format, args);
        System.out.println(message);
    }
}

// 调用
Logger.log("用户 %s 登录成功,次数: %d", "Alice", 3);

(2) 数学计算

public static int max(int... nums) {
    if (nums.length == 0) throw new IllegalArgumentException("无参数");
    int max = nums[0];
    for (int num : nums) {
        if (num > max) max = num;
    }
    return max;
}

// 调用
int maxVal = max(3, 9, 5); // 返回9

6. 总结

  • 优点:简化调用,支持灵活的参数数量。
  • 注意:确保可变参数在最后,避免重载歧义,处理null值。
  • 适用场景:参数数量不确定且类型相同的场景(如日志、工具方法)。

通过合理使用可变参数,可以显著提升代码的可读性和简洁性。

posted @ 2025-03-24 09:58  bravecap  阅读(248)  评论(0)    收藏  举报