Java可变长参数注意事项

本文深入解析了Java中可变长参数的原理、与数组的区别、调用优先级及多可变长参数方法匹配时的编译器行为。详细解释了Java可变长参数作为数组的一种形式,以及它们在方法调用和重载中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Java SE 5.0之后,提供了可以用可变的参数数量调用的方法(有时成为“变参”方法)。
例如定义方法add

public void add(int... params) {
    int result = 0;
    for (int param : params) {
        result += param;
    }
}

Question 1:可变长参数和数组的区别?

看一段代码

    public void add(int... params) {
        int result = 0;
        for (int param : params) {
            result += param;
        }
    }

    public void add(int[] params) {
        int result = 0;
        for (int param : params) {
            result += param;
        }
    }

这两个同名函数看上去应该是参数不相同的,属于方法重载(重载,就是函数或者方法有同样的名称,但是参数列表不相同的情形),
但实际上,这段代码是无法通过编译的。编译器提示错误为:“Duplicate method add(…)”,说明这两个方法的参数是相同的。

究其原因,在Java中,可变长参数实际上就是数组的另一种形式,只不过是为了方便在调用方法时不需要创建数组。在编译过程中,编译器遇到 int… ,直接将其转换为 int[] ,因此对于编译器来说,这两个方法的参数是一模一样的,不属于重载,因此不能通过编译。

Question 2:可变长参数方法和固定参数方法的调用的优先级?

    public static void print(String a,String b){
        System.out.println("固定参数");
        System.out.println(a);
        System.out.println(b);
    }

    public static void print(String... strings){
        System.out.println("可变长参数");
        for(String str:strings)
            System.out.println(str);
    }

    public static void main(String[] args){
        print("123","456");
    }

在上面这段代码的main函数中,调用了print()方法,但是在当前类中,同时有两个满足条件的方法,一个参数固定,一个参数为可变长。
运行结果为:

固定参数
123
456

这说明,当调用方法的时候,如果同时存在固定参数方法和可变长参数方法都满足条件的话,则优先调用固定参数方法。

Question 3:同时存在多个可变长参数方法匹配调用的时候,结果如何?

对Question2中代码稍作修改:

    public static void print(String a,String... strings){
        System.out.println(a);
        for(String str:strings)
            System.out.println(str);
    }

    public static void print(String... strings){
        for(String str:strings)
            System.out.println(str);
    }

    public static void main(String[] args){
        print("123","456");
    }

在上述代码中,同时存在两个可变长参数方法,而print(“123”,”456”)调用时同时满足这两个方法。
编译时发现,编译器提示:“The method print(String, String[]) is ambiguous”,编译器不知道该选哪个方法调用。
因此,同时存在两个可变长参数方法满足调用条件时,编译器无法通过编译。

Question 4:定义方法时可变长参数位置?以及可变长参数个数

    public void print(String... strings, String str) {
        System.out.println("可变长参数");
        for (String str : strings)
            System.out.println(str);
    }

编译器提示:“the variable argument type String of the method print must be the last parameter”。
当方法有多个参数时,可变长参数必须位于最后。
同时,这也意味着,一个方法最多只能存在一个可变长参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值