【从零开始学Java | 第二十八篇】可变参数

目录

前言

一、基本语法和使用

二、核心原理

三、使用可变参数的三大规则

1.可变参数必须放在参数列表的最后

2.一个方法只能有一个可变参数

3.方法重载时的优先级

总结


前言

我们经常会遇到这样一个场景:我们需要写一个方法,但传入该方法的参数个数是不确定的。比如,写一个计算多个整数之和的方法,你可能需要计算 2 个数的和,也可能需要计算 5 个数甚至 100 个数的和。

在 Java 5 之前,为了解决这个问题,我们通常只能要求调用者将数据封装到一个数组中传过来。这虽然能解决问题,但代码写起来往往略显繁琐。为了提升开发体验,Java 5 引入了一个非常实用的语法------可变参数(Variable Arguments,简称 Varargs)

一、基本语法和使用

可变参数的语法非常简单,只需要在参数类型后面加上三个点 ... 即可。

语法格式:

修饰符 返回值类型 方法名(数据类型... 变量名) {

// 方法体

}

场景演示:求一组不确定个数的整数之和

java 复制代码
public class Test {
    public static void main(String[] args) {
        System.out.println(getSum(1, 2));
        System.out.println(getSum(1, 2, 3, 4));
    }

    public static int getSum(int...args){
        int sum = 0;
        for (int arg : args) {
            sum += arg;
        }
        return sum;
    }
}

二、核心原理

实际上,可变参数在底层就是一个纯粹的数组

当你定义 int... numbers 时,Java 编译器在编译(生成 .class 字节码文件)时,会自动将其转换为 int[] numbers。而当你在调用 sum(1, 2, 3) 时,编译器实际上会偷偷帮你转换成 sum(new int[]{1, 2, 3})

这就是为什么我们在方法内部可以使用**增强 for 循环(for-each)**或者 numbers.length 来操作它的原因。

三、使用可变参数的三大规则

1.可变参数必须放在参数列表的最后

因为可变参数可以传入无限多个参数,而后面如果跟着一个和可变参数类型一样的参数,编译器就会混淆可变参数和不可变参数的界限。

2.一个方法只能有一个可变参数

还是与上一个出现的问题相同, 编译器会混淆两个参数之间的界限

3.方法重载时的优先级

Java 在解析重载方法时,总是优先匹配精确的参数类型,最后才考虑可变参数。

java 复制代码
public class OverloadDemo {
    
    public static void test(int a, int b) {
        System.out.println("调用了精确匹配的方法: test(int, int)");
    }

    public static void test(int... nums) {
        System.out.println("调用了可变参数的方法: test(int...)");
    }

    public static void main(String[] args) {
        test(1, 2);       // 这里会输出什么?
        test(1, 2, 3);    // 毫无疑问,这里调用可变参数
    }
}

总结

  • 底层是数组 :把它当作普通数组来处理即可。

  • 位置要放对 :必须且只能出现在参数列表的最后一位

  • 重载优先级 :尽量避免与普通参数方法发生重载冲突

😁💕

相关推荐
listhi520几秒前
基于QT的串口心电波形实时显示系统
开发语言·qt
之歆几秒前
DAY_12JavaScript DOM 完全指南(三):高级工程篇
开发语言·前端·javascript·ecmascript
invicinble1 分钟前
java数组相关的信息量
java·开发语言·python
小江的记录本1 分钟前
【Java基础】Java 8-21新特性 :JDK17:密封类、模式匹配、Record类(附《思维导图》+《面试高频考点清单》)
java·数据结构·后端·python·mysql·面试·职场和发展
小江的记录本3 分钟前
【Java基础】集合框架: ArrayList vs LinkedList 核心区别、扩容机制(附《思维导图》+《面试高频考点清单》)
java·数据库·python·mysql·spring·面试·maven
夕除4 分钟前
spring boot 10
java·python·spring
牧瀬クリスだ6 分钟前
Java线程——从创建第一个线程到休眠线程
java·开发语言
清水白石0087 分钟前
从“点一下导出”到生产级任务队列:Python 异步导出系统设计全景解析
java·数据库·python
Mahir088 分钟前
Spring 核心原理:IoC/DI 与 Bean 生命周期全景解析
java·后端·spring·面试·bean生命周期·控制反转ioc·依赖注入di
weixin_489690029 分钟前
NAS部署实测:Solon vs Spring Boot,从内存到包体积的“降维打击”
java·spring boot·后端