【JavaSE】Java中的可变参数

简介: 文章目录1 Java 可变参数简介2 使用可变参数优化代码3 可变参数注意事项写在最后

1 Java 可变参数简介

🍎 Java 允许将同一个类中 多个同名同功能但参数个数不同的方法封装成一个方法。其基本语法如下:

访问修饰符 返回类型 方法名(数据类型... 形参名){
  //方法体
}



🍑 那么可变参数究竟有什么用?别急接下来我们看一个案例:


利用方法的重载,在Method类里声明三个方法 sum,用于求2 ~ 4个数的和,并输出。在主函数中调用并测试


😎 话不多说,三下五除二代码就搞定了:

class Method{
    // 两数之和
    public void sum(int a, int b){
        System.out.println("两数之和: " + (a + b));
    }
    // 三数之和
    public void sum(int a, int b, int c){
        System.out.println("三数之和: " + (a + b + c));
    }
    // 四数之和
    public void sum(int a, int b, int c, int d){
        System.out.println("四数之和: " + (a + b + c + d));
    }
}
// 主类
public class Main {
    public static void main(String[] args) {
        Method my = new Method();
        my.sum(1,2);
        my.sum(1,2,3);
        my.sum(1,2,3,4);
    }
}


🍎 实现结果:


2 使用可变参数优化代码

✈️ 上述的示例中,我们通过函数的重载写了三个方法:


实现对两数求和;

实现对三数求和;

实现对四数求和。

而我们 通过可变参数,可以极大的优化代码,提高代码的简洁性, 下面这段代码实现的功能和样例一致 (在方法体中,可变参数可以看作数组使用):

class Method{
    // n数之和
    public void sum(int... nums){
        // 可变参数可以当作数组使用
        int sum = 0;
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
        }
        System.out.println(nums.length + "数之和为: " + sum);
    }
}
// 主函数
public class Main {
    public static void main(String[] args) {
        Method my = new Method();
        my.sum(1,2);
        my.sum(1,2,3);
        my.sum(1,2,3,4);
    }
}

🍎 实现结果:


3 可变参数注意事项

使用可变参数遵循如下规则:


⭐️ 可变参数的实参可以为 0个或任意多个;

⭐️ 可变参数的实参可以为数组;

⭐️ 可变参数的本质是数组;

⭐️ 一个形参列表只能出现一个可变参数;

⭐️ 可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后,例子如下:

(可行方案)

public void method(String s, int... nums){
  // 该声明可行
}

(错误示范)

public void method(int... nums, String s){
  // 该声明不可行
}


为什么第二种编译器不通过呢?

我们可以思考一下,如果把代码更改成这样:

public void method(int... nums, int x){
  // 该声明不可行
}


那我们在调用该方法时, 编译器就没有办法区分传入的参数到底匹配哪个参数。比如 method(1,2,3) 这里的1,2是可变参数匹配nums,3匹配int,还是1,2,3匹配可变参数,而判别传参错误呢?

很好理解:这点我们都不知道,编译器也当然没办法自行判断啦


相关文章
|
7月前
|
存储 Java 测试技术
滚雪球学Java(18):解密JavaSE中的堆栈:你真的了解Java内存吗?
【4月更文挑战第7天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
68 1
滚雪球学Java(18):解密JavaSE中的堆栈:你真的了解Java内存吗?
|
7月前
|
安全 Java 调度
【Java】JavaSE实现多线程
【Java】JavaSE实现多线程
89 1
|
7月前
|
Java
滚雪球学Java(17):探索循环控制:JavaSE中的break与continue秘技
【4月更文挑战第6天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
69 1
滚雪球学Java(17):探索循环控制:JavaSE中的break与continue秘技
|
6月前
|
IDE Java 编译器
五分钟学Java:可变参数究竟是怎么一回事?
五分钟学Java:可变参数究竟是怎么一回事?
|
7月前
|
存储 安全 Java
滚雪球学Java(19):JavaSE中的内存管理:你所不知道的秘密
【4月更文挑战第8天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
69 4
滚雪球学Java(19):JavaSE中的内存管理:你所不知道的秘密
|
7月前
|
Java 编译器
滚雪球学Java(36):玩转Java方法重载和可变参数,让你的代码更灵活
【5月更文挑战第11天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
45 0
滚雪球学Java(36):玩转Java方法重载和可变参数,让你的代码更灵活
|
7月前
|
存储 Java
Java 可变参数:灵活的函数调用艺术
【4月更文挑战第21天】
88 1
|
7月前
|
Java 程序员 编译器
JavaSE&Java8 Lambda 表达式
JavaSE&Java8 Lambda 表达式
30 0
|
7月前
|
存储 Java 程序员
JavaSE&Java的异常
JavaSE&Java的异常
50 0
|
7月前
|
存储 Java 测试技术
滚雪球学Java(11):高效编程之道:精通JavaSE顺序结构的关键技巧
【2月更文挑战第23天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!
73 2