Java 可变参数全解析:动态参数传递的实践指南
Java 可变参数全解析:动态参数传递的实践指南
一、可变参数:Java 方法的灵活扩展
在狂神说 Java 第 49 集课程中,我们系统学习了 Java 可变参数的核心原理。作为 Java SE 5 引入的重要特性,可变参数允许方法接受动态数量的输入,显著提升了代码的灵活性与复用性。本文将结合课程内容,深度解析可变参数的底层原理与实践技巧。
二、可变参数核心语法
1. 基础定义
public void printNumbers(int... numbers) {for (int num : numbers) {System.out.println(num);}
}
2. 调用方式
// 传递多个参数
printNumbers(1, 2, 3);// 传递数组
int[] arr = {4, 5, 6};
printNumbers(arr);
注意事项:
- 在方法声明中,在指定参数类型后加一个省略(…)
- 一个方法只能有一个可变参数
- 可变参数必须位于参数列表末尾
- 任何普通的参数必须在它之前声明
- 编译后可变参数会被转换为数组
三、可变参数与数组参数的对比
1. 语法差异
| 维度 | 可变参数 | 数组参数 |
|---|---|---|
| 定义方式 | int... numbers | int[] numbers |
| 调用方式 | method(1, 2, 3) | method(new int[]{1,2,3}) |
| 重载冲突 | 可能与数组参数冲突 | 明确类型 |
2. 性能对比
// 可变参数
public void testVarArgs(int... args) { ... }// 数组参数
public void testArray(int[] args) { ... }// 反编译后相同
public void testVarArgs(int[] args) { ... }
public void testArray(int[] args) { ... } // 编译错误⚠️
四、使用场景与典型案例
1. 日志工具类
public class Logger {public void log(String message, Object... params) {String formatted = String.format(message, params);System.out.println(formatted);}
}// 使用示例
logger.log("用户{0}登录成功,角色:{1}", "张三", "ADMIN");
2. 数学计算工具
public class MathUtils {public static double average(double... numbers) {if (numbers.length == 0) return 0;double sum = 0;for (double num : numbers) {sum += num;}return sum / numbers.length;}
}
五、常见错误与解决方案
1. 可变参数位置错误
错误示例:
public void test(String... names, int age) { // 编译错误⚠️System.out.println(age);
}
解决方案:
public void test(int age, String... names) { // 正确顺序System.out.println(age);
}
2. 重载歧义
错误示例:
public void test(int a, int... b) { ... }
public void test(int a, int b) { ... } // 编译错误⚠️
3. 空参数调用
错误示例:
public void test(String... args) {System.out.println(args[0]); // 可能空指针⚠️
}// 调用方式
test(); // args为长度0的数组
解决方案:
public void test(String... args) {if (args.length > 0) {System.out.println(args[0]);}
}
六、最佳实践总结
-
限制可变参数使用:
// 推荐做法 public void process(String... files) { ... } -
结合其他参数:
public void process(String prefix, String... files) {for (String file : files) {System.out.println(prefix + file);} } -
避免递归调用:
// 反模式 public void recursive(int... nums) {recursive(nums); // 无限递归⚠️ }// 推荐做法 public void recursive(int[] nums) {if (nums.length > 0) {// 处理逻辑} }
七、高频面试题解析
1. 可变参数的底层实现
-
可变参数本质是数组
-
反编译后代码示例:
public void test(int... args) → public void test(int[] args)
2. 如何传递空参数?
// 传递空数组
test(new int[]{});// 直接调用(JDK 1.5+)
test();
八、学习资源推荐
- Java 可变参数官方文档
- 狂神说 Java 课程
- 阿里巴巴 Java 开发手册
九、总结与互动
通过本文的学习,您将掌握:
- 可变参数的核心语法与实现原理
- 与数组参数的本质区别
- 常见错误的解决方案
- 动态参数传递的最佳实践
疑问引导:您在使用可变参数时遇到过哪些难以解决的问题?例如:
- 重载方法的参数组合冲突?
- 空参数调用导致的异常?
欢迎在评论区分享您的解决方案!
相关文章:
Java 可变参数全解析:动态参数传递的实践指南
Java 可变参数全解析:动态参数传递的实践指南 一、可变参数:Java 方法的灵活扩展 在狂神说 Java 第 49 集课程中,我们系统学习了 Java 可变参数的核心原理。作为 Java SE 5 引入的重要特性,可变参数允许方法接受动态数量的输入&…...
C++类与对象(上):从入门到实践
目录 一、引言 二、面向过程和面向对象初步认识 2.1 面向过程编程 2.2 面向对象编程 三、类的引入 四、类的定义 4.1 定义格式 4.2 定义方式 4.3 成员变量命名规则建议 五、类的访问限定符及封装 5.1 访问限定符 5.2 封装 六、类的作用域 七、类的实例化 7.1 概念…...
Lumerical ------ Edge coupler design
Lumerical ------ Edge coupler design 引言正文无 Si Substrate 的仿真步骤有 Si Substrate 的仿真步骤引言 本文,我们将使用官方提供的 Edge coupler 设计教程,但是中间会带有作者本人的设计的感悟。 正文 无 Si Substrate 的仿真步骤 打开 Edge_Coupler_No_Substrate.l…...
大语言模型本质上还是自动化,而不是智能化
大语言模型本质上仍然是自动化或高级自动化,而非真正的智能化,原因可以从以下几个方面进行分析:1、自动化与智能化的本质区别自动化:大语言模型通过预训练和微调,基于大量数据和规则生成输出。它的行为是基于输入数据的…...
cmake 中的命令
命令描述示例capabilities报告 CMake 内置的功能,以 JSON 格式输出cmake -E capabilitiescat连接文件并将其内容打印到标准输出cmake -E cat file1.txt file2.txtchdir在指定目录中运行命令cmake -E chdir /path/to/dir commandcompare_files比较两个文件是否相同cm…...
python数据结构——链表、栈、队列
一、思维梳理: 二、双向循环链表: class Node:def __init__(self,data):self.data dataself.next Noneself.prev Noneclass DoubleLink:def __init__(self):self.size 0self.head Nonedef is_empty(self):return self.size 0def add_end(self,dat…...
centos操作系统如何更换yum镜像源
CentOS Linux 是一个免费提供的、社区支持的Linux发行版,由CentOS项目社区贡献者开发、分发和维护。2020年CentOS项目宣布将把全部投资转移到CentOS Stream,作为即将发布的 Red Hat Enterprise Linux版本的上游开发平台。因此,CentOS Linux更新和发布将在2021年至2024年期间…...
【Linux篇】自主Shell命令行解释器
📌 个人主页: 孙同学_ 🔧 文章专栏:Liunx 💡 关注我,分享经验,助你少走弯路! 文章目录 1. 获取用户名的接口2. 等待用户输入接口3. 将上述代码进行面向对象式的封装4. 命令行解析5.…...
Tomcat 部署 Jenkins.war 详细教程(含常见问题解决)
在Tomcat中部署Jenkins.war文件是一个相对简单的过程,以下是详细步骤: 1. 准备工作 确保已安装JDK:Jenkins需要Java环境,建议安装JDK 8或更高版本。 下载Jenkins.war:https://pan.quark.cn/s/c4fd7711a1b3 下载Tomc…...
我的创作纪念日-一周年
目录 机缘 收获 日常 成就 憧憬 机缘 时光荏苒,转行计算机已经是第5个年头了。从Python入门,到C入土,兜兜转转,发现自己也只是初窥门径,习得皮毛。我从6年前开始潜水CSDN,学习各路大佬的技术经验&…...
多线程代码案例 - 1
目录 单例模式 1. 饿汉模式 2. 懒汉模式 单例模式与多线程 问题1 问题2 问题3 完! 单例模式 单例模式是一种设计模式。 设计模式,是我们在编写代码时候的一种软性的规定,也就是说,我们遵守设计模式,代码的下限…...
display:none与visibility的区别
1. 是否占据空间 display: none:元素完全从文档流中移除,不占据任何布局空间。后续元素会“填补”它的位置。visibility:hidden:元素仍占据布局空间,但内容不可见(类似透明占位符)。 2.渲染与性能 displ…...
算法 | 基于蜣螂优化算法求解带时间窗的车辆路径问题(VRPTW)研究(附matlab代码)
基于蜣螂优化算法求解带时间窗的车辆路径问题(VRPTW)研究 🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏 摘要 带时间窗的车辆路径问题(VRPTW)是物流配送中的核心优化难题。本文提出一种基于蜣螂优化算法(Dung Beetle Optimizer, DBO)的求解方法,通过…...
开发体育赛事直播系统主播认证功能技术实现方案
该体育直播系统系统由东莞梦幻网络科技开发,使用 ThinkPHP 作为后端,Vue.js 作为 PC/H5 端框架,Java 和 Objective-C 分别用于安卓和 iOS 开发。 1、前端实现 (Vue.js) <template><div class"anchor-certification">…...
国产三维CAD「皇冠CAD」在汽车零部件领域建模教程:刹车片
本教程深度融合三维皇冠CAD(CrownCAD)的MBD(Model-Based Definition)设计理念,通过参数化建模、智能约束管理、动态装配验证等功能,实现数据驱动设计,精准解决了汽车制动系统中精密制动组件的设…...
基于指针的线程池
使用原线程池 当 push 和 pop的对象过大时,消耗时延过高,需优化线程池 采用 std::move() unique_ptr的方法,能极大的减少时延, 实际就是避免了多次拷贝,直接使用指针。 代码实现 ThreadPool…...
GitHub与Gitee各是什么?它们的区别与联系是什么?
李升伟 整理 GitHub 介绍 GitHub 是一个基于 Git 的代码托管平台,主要用于版本控制和协作开发。它支持多人协作,提供代码托管、问题跟踪、代码审查、项目管理等功能。GitHub 是全球最大的开源社区,许多知名开源项目都在此托管。 主要功能&…...
SpringMvc获取请求数据
基本参数 RequestMapping("save5") ResponseBody public User save5(String name, int age) {User user new User();user.setName(name);user.setAge(age);return user; } 在url中将name与age进行编写,通过框架可以提取url中的name与age,这…...
简述竞赛经历在考研复试中的作用
文章目录 前言拟录取情况baichuicxyAshy佬齐总结回首展望 前言 随着就业形式的不断变化,竞赛奖项在就业中能起到的作用在逐步减弱。想拿到头部大厂实习面试资格,最低要区域赛银牌起步,当然这也仅仅是面试资格。 那么,竞赛经历在…...
大语言模型开发框架——LangChain
什么是LangChain LangChain是一个开发由语言模型驱动的应用程序的框架,它提供了一套工具、组件和接口,可以简化构建高级语言模型应用程序的过程。利用LangChain可以使应用程序具备两个能力: 上下文感知 将语言模型与上下文(提示…...
Nginx 核心配置详解与性能优化最佳实践
1.什么是 Nginx? Nginx 是一个高性能的 Web 服务器和反向代理服务器。它轻量、高效,被广泛用于现代 Web 开发中。 2.为什么前端需要了解 Nginx? ★ 了解 本地开发:可以模拟生产环境 部署前端项目:作为静态文件服务器…...
机器学习的一百个概念(7)独热编码
前言 本文隶属于专栏《机器学习的一百个概念》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见[《机器学习的一百个概念》 ima 知识库 知识库广场搜索&…...
用LLama factory时报类似Process 2504721 got signal: 1的解决方法
之前用nohup来远程跑LLama factory微调脚本,是没有问题的,但今天发现运行类似下面这个命令时, nohup llamafactory-cli train examples/train_qlora/qwen_lora.yaml 只要一关闭ssh session,就会终止训练,报类似&…...
解决 Git 通过 SSH 克隆仓库时自动转换为 HTTPS 的问题
解决 Git 通过 SSH 克隆仓库时自动转换为 HTTPS 的问题 在使用 Git 通过 SSH 协议克隆私有仓库时,如果遇到类似以下错误: fatal: unable to access https://itlab.stack.net:stack.git/: Could not resolve host: gitlab.stack这通常是因为 Git 配置错…...
从实用的角度聊聊Linux下文本编辑器VIM
本文从实用的角度聊聊Vim的常用命令。何为实用?我举个不实用的例子大家就明白了,用vim写代码。;) “vim是从 vi 发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用,和Emacs并列成…...
多电机显示并排序
多电机显示并排序 要实现根据后端传递过来的驱动电机数据的数量来显示不同数量的数据列表,我们可以使用 Vue 的 v-for 指令来遍历 driveMotorData 数组,并为每个驱动电机生成一个数据列表。这样,无论后端传来多少个驱动电机的数据࿰…...
佳能imageRUNNER 2206N基本参数及管理员密码
基本参数: 产品类型 激光数码复合机 颜色类型 黑白 涵盖功能 复印/打印/扫描 速度类型 低速 最大原稿尺寸 A3 复印/打印方式 激光静电转印方式 感光材料 OPC 显影系统 干式单组分显影 定影…...
社交类 APP 设计:打造高用户粘性的界面
在当今数字化时代,社交类APP已成为人们日常生活中不可或缺的一部分。然而,随着市场竞争的加剧,如何通过设计提升用户粘性成为社交类APP成功的关键。本文将从设计的关键要素、用户界面优化、功能创新、个性化体验以及持续优化等方面࿰…...
数据编排与Dagster:解锁现代数据管理的核心工具
在数据驱动的时代,如何高效管理复杂的数据管道、确保数据质量并实现团队协作?本文深入探讨数据编排的核心概念,解析其与传统编排器的差异,并聚焦开源工具Dagster如何以“资产为中心”的理念革新数据开发流程,助力企业构…...
网络安全中的“后门”:概念、类型、作用与攻防技术
目录 什么是后门? 后门的常见类型 2.1 按植入方式分类 2.2 按功能分类 后门在安全测试中的作用 后门的玩法与免杀技术 4.1 常见后门技术 4.2 如何实现免杀(Bypass AV) 如何检测和防御后门? 总结 1. 什么是后门ÿ…...
