Java——可变参数

news2024/11/23 21:37:51

一、可变参数

1、介绍

Java的可变参数(Varargs)是一种语法特性,允许一个方法接受不定数量的参数。可变参数的使用通过在参数类型后面添加省略号(...)实现。这使得方法在调用时可以传入不同数量的参数,而不需要为每种情况分别定义方法。

2、具体语法

可变参数的具体语法:

返回类型 方法名(参数类型... 参数名) {
    // 方法体
}

3、内部具体原理

在方法内部,可变参数实际上被当作一个数组来处理。如果你定义了一个可变参数类型为int...,在方法内部它将被视为一个int[]数组。因此,你可以使用数组的方式来遍历和操作这些参数。

class Calculator {
	//可以传入任意个int参数的加法方法
	public int sum(int... nums) {
		int sum = 0;
		for(int i = 0; i < nums.length; i++) {
			sum += nums[i];
		}
		return sum;
	}
}

4、可变参数的规则和注意事项

1)一个方法只能有一个可变参数

public void method(int... numbers, String... strings) {
    // 编译错误
}

2)可变参数可以与其他参数一起使用,但可变参数必须是方法的最后一个参数

public void method(String str, int... numbers) {
    // 合法
}

public void method(int... numbers, String str) {
    // 编译错误
}

4)传入数组也可以匹配可变参数

也就是说当我们的一个方法的参数中有可变参数时,当我们在调用这个方法时,传入了一个数组,这个数组的内容就可以与可变参数匹配。

public class Test {
	public static void main(String[] args) {
		Calculator myCalculator = new Calculator();
		int[] arr = {1, 2, 3};
		int res = myCalculator.sum(arr);
		System.out.println(res);
	}
}

class Calculator {
	//可以传入任意个int参数的加法方法
	public int sum(int... nums) {
		int sum = 0;
		for(int i = 0; i < nums.length; i++) {
			sum += nums[i];
		}
		return sum;
	}
}

运行结果:

但是如果要以数组为参数传入的话则只能给这个可变参数传入这个数组,不能再传入其他整型。例如下面就是错的:

对于这个可变参数只能传入一个数组。

二、可变参数使用

1、计算多个int型数据的乘积

public class Test {
	public static void main(String[] args) {
		Calculator myCalculator = new Calculator();
		int res = myCalculator.getProduct(1, 2, 3);
		System.out.println("result of 1 * 2 * 3 = " + res);
	}
}

class Calculator {
	//可变参数
	public int getProduct(int... nums) {
		int product = 1;
		for(int i = 0; i < nums.length; i++) {
			product *= nums[i];
		}
		return product;
	}
}

运行结果:

2、Java 中的 printf 方法

是的,Java中的printf方法使用了可变参数。printf方法是PrintStream类的一部分,通常通过System.out调用,用于格式化输出。以下是printf方法的一个常见签名:

public PrintStream printf(String format, Object... args)

后面就是可变参数,它的可变参数也是遵循上面的规则的。

我们在使用 printf 方法时,可以传入不同数目个变量,然后通过最前面的字符串格式化打印后面的变量的值。

public class Main {
    public static void main(String[] args) {
        int age = 25;
        String name = "Alice";
        double score = 95.5;

        System.out.printf("Name: %s, Age: %d, Score: %.2f%n", name, age, score);
        System.out.printf("Name: %s, Age: %d", name, age);
    }
}

可以发现这里可以传入不同数目的参数。

具体实现就是通过可变参数。

在Java中,printf方法的可变参数使用的是Object... args,这意味着你可以传入任意数量的参数,这些参数的类型可以是任何对象类型或者其子类。因为所有类型在Java中最终都继承自Object类,所以可以传入不同类型的参数。

Java中的所有类都继承自Object类,因此任何类型的对象都可以作为Object类型的参数传递。这是Java的继承和多态性特性。基本数据类型(如intdouble等)在需要的时候会自动装箱为其对应的包装类(如IntegerDouble等)。这些包装类都继承自Object,所以也可以作为参数传递。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1827052.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【靶场搭建】-01- 在kali上搭建DVWA靶机

1.DVWA靶机 DVWA&#xff08;Damn Vulnerable Web Application&#xff09;是使用PHPMysql编写的web安全测试框架&#xff0c;主要用于安全人员在一个合法的环境中测试技能和工具。 2.下载DVWA 从GitHub上将DVWA的源码clone到kali上 git clone https://github.com/digininj…

新机器到底是入手DDR5还是DDR4?2024年的DDR5能否战未来?

前言 前几天有个小伙伴发来问候&#xff1a;在今年&#xff08;2024年&#xff09;装新机器到底是选择DDR4还是DDR5&#xff1f; 小白淡定了抿了一口茶&#xff0c;缓缓道&#xff1a;…… 小伙伴不淡定了&#xff01;上来就是一句&#xff1a;2024年的DDR5能否战未来&#…

用一个ESP32S3-Zero把有线键盘变为无线

三脚猫最近一直琢磨&#xff0c;那些喜欢买剪线键盘&#xff0c;以及自制键盘瞎折腾的人都是怎么搞的。经过不懈努力&#xff0c;终于想明白除了直接的硬件一个个pin针的高低电压判断后转给蓝牙&#xff0c;拿到现成的古董剪线键盘还有一个方式其实是在usb host转发给蓝牙类似这…

凭什么只有我不能触摸她的心?JavaScript的作用域?作用域链?预编译?

前言 凭什么后来者居上&#xff1f;凭什么她的心只有我不能触摸&#xff1f;&#xff08;o(╥﹏╥)o&#xff09; 让我从JavaScript中的作用域、作用域链和预编译开始聊聊&#xff0c;相信你一定能从中有收获的 什么是的作用域&#xff1f; 简单来说就是能被访问的区域&…

ROS-SLAM雷达

使用前准备工作 1、新建工作空间、编译功能包 以建立名字为rplidar_ws为例&#xff0c;终端输入 mkdir rplidar_ws cd rplidar_ws mkdir src cd src catkin_init_workspace rplidar_ros功能包&#xff1a;git下载。 https://github.com/Slamtec/rplidar_ros/ 然后把解压的…

vue(v-if,v-else-if-else-show)

基本应用 例子 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTE-8"> <meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-w…

斯坦福ALOHA机器人团队最新论文-HumanPlus: 从人类学习的人形机器人动作模仿和自主操作

斯坦福ALOHA机器人团队最新论文-HumanPlus&#xff0c;继续推进了机器人技术的前沿进展&#xff0c;我进行了部分翻译和解读&#xff1a; HumanPlus人形机器人系统技术解读 1 简介 本教程将介绍一个名为HumanPlus的全栈式人形机器人系统。该系统能够让机器人从人类数据中学习…

面向事件编程之观察者模式

前言 村里的老人常说&#xff1a;真男人就该懂得遵守“三不原则”——不主动、不拒绝、不负责。 一个复杂的软件系统&#xff0c;其中必然会存在各种各样的“对象”&#xff0c;如果在设计之初没有注意控制好耦合度&#xff0c;导致各个对象甚至是函数之间高度耦合&#xff0…

如何用 Google Chrome 浏览器浏览经过 XSLT 渲染的XML 文件

对于经过 XSLT 渲染的XML 文件&#xff0c;本来&#xff0c;可以直接用 IE (Internet Explorer) 打开&#xff0c;就能看到渲染之后的样子&#xff0c;很方便。但是后来&#xff0c;微软把 IE 换成了 Microsoft Edge&#xff0c;按理说这是比 IE 更先进的浏览器&#xff0c;可是…

centos7系统使用docker-compose安装部署jenkins

CentOS7系统使用docker-compose安装部署jenkins&#xff0c;并实现前后端自动构建 记录一次在给公司部署jenkins的真实经历&#xff0c;总结了相关经验 1.准备环境 1.java 由于最新的jenkins需要jdk11以上才能支持&#xff0c;而系统里的jdk是1.8的&#xff0c;因此等jenkins…

qmt交易框架2.0版本----支持实时高频交易

经过了2个星期的开发&#xff0c;终于迎来了qm交易框架2.0&#xff0c;超过了3000行源代码&#xff0c;使用类开发&#xff0c;使用方便。 我们看看利用框架写一个简单的实时高频交易策略&#xff0c;很简单 源代码 from qmt_trader.qmt_trader import qmt_traderfrom qmt_tr…

工业 web4.0 的 UI 卓越非凡

工业 web4.0 的 UI 卓越非凡

求导,积分

求导公式&#xff1a; 复合函数求导法则&#xff1a;两个函数导函数的乘积. 例如&#xff1a;f(x)2x1,f(x)2,g(x)x^24x4,g(x)2x4 那么复合函数&#xff1a; g(f(x))(2x1)^24(2x1)4 把&#xff08;2x1&#xff09;看做整体,则g2(2x1)4 然后再求&#xff08;2x1&#xff09;的导函…

代码随想录算法训练营刷题复习1 :动态规划背包问题 01背包+完全背包

动态规划刷题复习 一、01背包 416. 分割等和子集1049. 最后一块石头的重量 II494. 目标和474. 一和零 416. 分割等和子集 class Solution { public:bool canPartition(vector<int>& nums) {int sum0;for(int i0;i<nums.size();i) {sumnums[i];}if(sum%2!0)retu…

Tuple 元组

文章目录 一、什么是元组 &#xff1f;二、元组的具体操作2.1 创建元组2.1.1 tuple() 创建元组函数和 list() 创建列表函数总结 2.2 元组的元素访问操作2.3 元组的元素计数操作2.4 zip 对象 一、什么是元组 &#xff1f; 列表属于可变序列,可以任意修改列表中的元素。 元组的…

JUC并发编程-第二天:线程池相关

线程池相关 线程池内置线程池的使用线程池的关闭excute方法和submit方法的区别 线程池 线程池就是一个可以复用线程的技术 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,Thread…

HTML静态网页成品作业(HTML+CSS)——游戏永劫无间网页(3个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有3个页面。 二、作品演示 三、代…

初见 Rollup 的十大常见问题

文章目录 初见 Rollup 的十大常见问题1. 超神奇的 Rollup 英文解释&#xff01;2. 为什么 ESM 要比 CommonJS 要好呢&#xff1f;3. 什么是 tree-shaking ?4. 如何使用 Rollup 处理 CommonJS&#xff1f;5. 为什么 node-resolve 不是一个内置功能&#xff1f;6. 为什么在进行代…

网络协议,OSI,简单通信,IP和mac地址

认识协议 1.讲故事 2004年&#xff0c;小明因为给他爹打电话&#xff08;座机&#xff09;费用太贵&#xff0c;所以约定一种信号&#xff0c;响一次是报平安&#xff0c;响两次是要钱&#xff0c;响三次才需要接通。 2.概念 协议&#xff1a;是一种约定&#xff0c;这种约…

如何实现电脑监视员工的电脑屏幕?六个方法偷偷分享给你

实现电脑监视员工的电脑屏幕&#xff0c;通常需要借助专业的监控软件或系统&#xff0c;这些工具旨在帮助企业管理者监督员工的工作状态&#xff0c;确保工作效率&#xff0c;同时保护公司资产和数据安全。以下是几种常见的实现方式。 1. 使用专业的远程监控软件 安企神软件&a…