Java 不定长度参数

在调用某个方法时,若是方法的参数个数事先无法确定该如何处理?例如System.out.printf()方法中并没有办法事先决定要给的参数个数,像是:

?


1

2

3

System.out.printf("%d",10);

System.out.printf("%d %d", 10, 20);

System.out.printf("%d %d %d", 10, 20, 30);

在J2SE 5.0之后开始支持不定长度参数(Variable-length Argument),这可以让您轻松的解决这个问题,直接来看下面的范例:

?

MathTool.java

1

2

3

4

5

6

7

8

9

public class MathTool {

public static int sum(int ... nums ) { //使用…声明参数

int sum = 0;

for(int num : nums) {

sum += num;

}

return sum;

}

}

要使用不定长度参数,在声明参数行时要在类型关键词后加上…,而在sum()方法的区块中可以看到,实际上nums是一个数组,编译器会将参数行的(int … nums)解释为(int[] nums),可以以下范例的方式制定各种长度的参数给方法来使用。

?

TestVarargs.java

01

02

03

04

05

06

07

08

09

10

11

12

13

14

public class TestVarargs {

public static void main(String[] args) {

int sum = 0;

sum = MathTool.sum(1, 2);

System.out.println("1 + 2 = " + sum);

sum = MathTool.sum(1, 2, 3);

System.out.println("1 + 2 +3 = " + sum);

sum = MathTool.sum(1, 2, 3, 4, 5);

System.out.println("1 + 2 + 3 + 4 + 5 = " + sum);

}

}

执行结果:

1 + 2 = 3
    1 + 2 +3 = 6
    1 + 2 + 3 + 4 + 5 = 15
 
    编译器会将传递给方法的参数解释为int数组传入至sum()中,所以实际上不定长度参数的功能也是自J2SE 5.0后所提供的编译蜜糖(Compiler Sugar)。
 
   在方法上使用不定长度参数时,记得必须声明的参数必须设置在参数行的最后一个。例如下面的方式是合法的:

?


1

2

3

public void someMethod(int arg1, int arg2, int ... varargs) {

// ...

}

但下面的方式是不合法的:

?


1

2

3

public void someMethod(int ... varargs , int arg1, int arg2) {

// ...

}

也无法使用两个以上的不定长度参数,例如下面的方式是不合法的:

?


1

2

3

public void someMethod(int ... varargs1, int ... varargs2){

// …

}

如果使用对象的不定长度参数,声明的方法相同。例如:

?


1

2

3

public void someMethod(SomeClass… somes){

// …

}

时间: 2025-01-08 19:00:35

Java 不定长度参数的相关文章

java不定参数String... args

先看两个简单的例子,来感受一下Java的不定长度参数 第一个例子: Java代码   public class VariArgs { public static void main(String[] args) { test(); test("aaa"); test("aaa", "bbb"); test("aaa", "bbb", "ccc"); } public static voi

Java的不定长参数和Python的不定长参数对比

一:起因 (0)不定长参数,也叫可变的参数,就是再调用函数之前,并不确定到底需要传递多少个参数 (1)Java中的不定长参数用String... args / int... args等三个点来表示:Python中用*args元组来表示 / **args字典(map)来表示  (2)不定参数有两个规定:第一,方法的参数列表中最多只有一个不定长度的参数:第二,就是不定长度的数组的位置必须是最后一个参数.不然不能通过编译. 二:实例对比 (1)Python的不定长参数 第一种方法--以一个*开始的参数

scala 学习笔记(03) 参数缺省值、不定个数参数、类的属性(Property)

继续学习,这一篇主要是通过scala来吐槽java的,同样是jvm上的语言,差距咋就这么大呢? 作为一个有.NET开发经验的程序员,当初刚接触java时,相信很多人对java语言有以下不爽(只列了极小一部分): 1. 一堆的setter/getter方法,没有c#中的property属性概念 2. 方法的参数值,不能设置缺省值 3. 不定个数参数的写法太单一 ... 然后java的拥护者讲出一堆大道理,说这样设计是如何如何有道理,各种洗脑,时间长了,也就被迫习惯了.要不是遇到scala,我还真就

STM32F4 UART1 DMA发送和接收不定长度数据

STM32F4 串口收发使用DMA还是很方便的.但是配置DMA时需要配置数据长度,这一点对于发送来说可以预估计自己发送的长度来配置DMA发送数据长度,但是对于接收不是很好解决,因为如果使用DMA接收中断是要配置的数据长度减到0才能出发中断.但是我们无法判断接受数据的长度,导致无法判断数据接收完成.网上有提出的解决方法是用定时器固定周期的读DMA接收的长度来判断是否接收完成,也有使用UART的空闲中断来处理的.在这里我使用UART的空闲中断来处理接收不定长数据.当然也要打开DMA接收完成中断,处理

通过回车键来结束一段不定长度的数组的输入。

问题描述: 输入样例:1 2 3 4 5 6 输出样例:1 2 3 4 5 6 不定长度,数据之间以空格间隔,以回车键结束输入. 解决误区: 前期解决问题,一直在考虑想通过Scanner类来获取到'\n'来跳出输入循环 通过几次尝试,发现用next()方法并不能获取到所想要获取的东西. 后期方案: 以回车键结束一串数据的录入,则所有需要录入的数据肯定为一行,则可用nextline()函数来获取全部. 详见下列代码: package blogtext; import java.util.Array

java 虚拟机启动参数 (转)

在Java.J2EE大型应用中,JVM非标准参数的配置直接关系到整个系统的性能. JVM非标准参数指的是JVM底层的一些配置参数,这些参数在一般开发中默认即可,不需要任何配置.但是在生产环境中,为了提高性能,往往需要调整这些参数,以求系统达到最佳新能. 另外这些参数的配置也是影响系统稳定性的一个重要因素,相信大多数Java开发人员都见过“OutOfMemory”类型的错误.呵呵,这其中很可能就是JVM参数配置不当或者就没有配置没意识到配置引起的. 为了说明这些参数,还需要说说JDK中的命令行工具

不定长参数和进程

不定长参数 就是不限定长度的参数 *arge(位置传参) →返回的是元组 案例: **kearge(带参数名传参)→返回的是字典 案例: 将俩者合在一起才是真的不定长参数(*args一定要放在前面) 案例: 函数生成器: 案例: 尝试执行try中的代码,如果有错,则被expect捕获,但是整个程序不会崩溃,代码如下: 进程和线程: 进程:是系统中正在运行的一个程序,程序一旦运行就是进程.简单的说每次都只能运行一个程序,一个完成以后才能进行下一个. 案例: 线程:一个进程还可以拥有多个并发的执行线

五分钟学Java:可变参数究竟是怎么一回事?

在逛 programcreek 的时候,我发现了一些专注基础但不容忽视的主题.比如说:Java 的可变参数究竟是怎么一回事?像这类灵魂拷问的主题,非常值得深入地研究一下. 我以前很不重视基础,觉得不就那么回事嘛,会用就行了.就比如说今天这个主题,管它可变不可变呢,不就是个参数嘛,还能有多大学问--抱着这种态度,我一直横行江湖近十载(苦笑).可等到读者找我提一些基础的问题时,我几乎回答不上来,感觉知识是散的,或者是浮于表面的.幸好最近一段时间,我开始幡然醒悟,开始不放过任何一个细节,渐渐地,有点"

【java】深入了解JAVA可变长度的参数

到J2SE 1.4为止,一直无法在Java程序里定义实参个数可变的方法——因为Java要求实参(Arguments)和形参(Parameters)的数量和类型都必须逐一匹配,而形参的数目是在定义方法时就已经固定下来了.尽管可以通过重载机制,为同一个方法提供带有不同数量的形参的版本,但是这仍然不能达到让实参数量任意变化的目的. 然而,有些方法的语义要求它们必须能接受个数可变的实参——例如著名的main方法,就需要能接受所有的命令行参数为实参,而命令行参数的数目,事先根本无法确定下来. 对于这个问题