Java 可变长参数列表
Java中定义了变长参数,允许在调用方法时传入不定长度的参数。
定义及调用
在定义方法时,在最后一个形参后加上三点 …,就表示该形参可以接受多个参数值,多个参数值被当成数组传入。上述定义有几个要点需要注意:
可变参数只能作为函数的最后一个参数,但其前面可以有也可以没有任何其他参数
由于可变参数必须是最后一个参数,所以一个函数最多只能有一个可变参数
Java的可变参数,会被编译器转型为一个数组
变长参数在编译为字节码后,在方法签名中就是以数组形态出现的。这两个方法的签名是一致的,不能作为方法的重载。如果同时出现,是不能编译通过的。可变参数可以兼容数组,反之则不成立
public void foo(String...varargs){}
foo("arg1", "arg2", "arg3");
//上述过程和下面的调用是等价的
foo(new String[]{"arg1", "arg2", "arg3"});
例如,求任意个整数的乘积。
package exercise;
public class product {
public static int func(int... args){
int ret = 1;
for(int i:args) ret *= i;
return ret;
}
public static void main(String[] args){
System.out.println(func(1,2,3));
System.out.println(func(2,2,2,2,2,2));
System.out.println(func(100,1000));
}
}
由于可变长参数就是被编译器转化为数组实现的,我们完全可以写成以数组做参数的形式:
package exercise;
public class product {
public static int func(int[] args){
int ret = 1;
for(int i:args) ret *= i;
return ret;
}
public static void main(String[] args){
System.out.println(func(new int[]{1,2,3}));
System.out.println(func(new int[]{2,2,2,2,2,2}));
System.out.println(func(new int[]{100,1000}));
}
}
方法重载
优先匹配固定参数
调用一个被重载的方法时,如果此调用既能够和固定参数的重载方法匹配,也能够与可变长参数的重载方法匹配,则选择固定参数的方法:
public class Varargs {
public static void test(String... args) {
System.out.println("version 1");
}
public static void test(String arg1, String arg2) {
System.out.println("version 2");
}
public static void main(String[] args) {
test("a","b"); //version 2 优先匹配固定参数的重载方法
test(); //version 1
}
}
匹配多个可变参数
调用一个被重载的方法时,如果此调用既能够和两个可变长参数的重载方法匹配,则编译出错:
public class Varargs {
public static void test(String... args) {
System.out.println("version 1");
}
public static void test(String arg1, String... arg2) {
System.out.println("version 2");
}
public static void main(String[] args) {
test("a","b"); //Compile error
}
}
参考链接:http://www.runoob.com/w3cnote/java-varargs-parameter.html
Java 可变长参数列表的更多相关文章
- 在Python中使用可变长参数列表
函数定义 在函数定义中使用*args和**kwargs传递可变长参数. *args用作传递非命名键值可变长参数列表(位置参数); **kwargs用作传递键值可变长参数列表 函数调用 在调用函数时,使 ...
- 可变长参数列表误区与陷阱——va_arg不可接受的类型
可变长参数列表误区与陷阱--va_arg不可接受的类型 实现一个有可变长参数列表函数的时候,会使用到stdarg.h(这里不讨论varargs.h)中提供的宏. 例如,我们要实现一个简易的my_pri ...
- Java可变长参数方法调用问题
不说废话,直接上代码: package mytest; import java.util.List; public class TestClass { public void method(List& ...
- go实例—函数或方法的可变长参数
支持可变长参数列表的函数可以支持任意个传入参数,比如fmt.Println函数就是一个支持可变长参数列表的函数. 需要注意的是,可变长参数应该是函数定义的最右边的参数,即最后一个参数 package ...
- Java中可变长参数的使用及注意事项
在Java5 中提供了变长参数(varargs),也就是在方法定义中可以使用个数不确定的参数,对于同一方法可以使用不同个数的参数调用,例如print("hello");print( ...
- Java中可变长参数的方法
原文转自:http://www.cnblogs.com/lanxuezaipiao/p/3190673.html 在Java5 中提供了变长参数(varargs),也就是在方法定义中可以使用个数不确定 ...
- Java可变参数/可变长参数
Java可变参数/可变长参数 传递的参数不确定长度,是变长的参数,例如小例子: package demo; public class Demo { public static int sum(int ...
- Java 数组 可变长参数 实例
可以把类型相同但个数可变的参数传递给方法,方法中的参数声明如下: typeName...parameterName (类型名...参数名) 在方法声明中,指定类型后紧跟着省略号...,只能给方法指定一 ...
- java中可变长参数
** * Created by Lenovo on 2017/12/10. * java中可变长参数 */ public class reflect04 { //m1有一个int类型的可比变长参数 / ...
随机推荐
- Linux 之添加系统环境变量
PATH 值是一系列目录,当执行命令时,linux就在这些目录下查找,其格式为: PATH=$PATH:<PATH1>:<PATH2>:<PATH3>:------ ...
- CRC原理总结
CRC常用于判断文件在传输过程中文件内容是否被更改以及其他的一些加密算法,在Java中,CRC32 工具类提供给我们使用. 1.CRC校验具体原理如下: 在要发送的数据帧后面附加一个数(这个就是用来校 ...
- Jsoncpp写“鱘”的json数据,报错。
最近在用Json::FastWriter生成json数据时,发现一个问题.含有“鱘”字的json字段会多出一个斜杠,不知道是不是编码的问题. C++要使用JSON来解析数据,一般采用jsoncpp. ...
- redis win系统安装并设置开机自启
安装包下载网址 :https://github.com/MSOpenTech/redis/releases 找到最新发布的安装包进行下载 下载完后解压到c盘 打开cmd,并进到redis里面 cd C ...
- ue4 创建简易动画
这个功能本来是在原动画基础上做调整用的,所以直接用来做动画并不是很合适,如果要做复杂动画,叠加的轨迹会非常多,不好用 (蒙皮好的)模型右键,创建一个动画合成 点开这个动画合成,创建动画序列(就是普通动 ...
- [转] ios数组基本用法和排序
http://blog.csdn.net/daiyelang/article/details/18726947 1.创建数组 // 创建一个空的数组 NSArray *array = [NSArray ...
- ps 命令参数解释
转自:https://www.cnblogs.com/fps2tao/p/7692482.html A 显示所有进程(等价于-e)(utility)-a 显示一个终端的所有进程,除了会话引线-N 忽略 ...
- this真题编译
1 x y z分别输出的是什么? var x=1, y=z=0; function add(n){ return n= n+1; }; y=add(x); function add(n){ retu ...
- XmlSerilizer序列化出错时,不妨考虑BinaryFormatter
当你使用XmlSerilizer序列化一个结构复杂的类型时出现反射出错 XmlSerilizer并不会告诉你哪个字段属性或者嵌套的字段属性不能被序列号,面对多年前的代码逐一排查很恼人使用BinaryF ...
- GIT使用笔记一:GIT初始化配置
本人系统环境:centos6.5 下 LNMP centos下git安装很简单sudo yum install gitOK 可先进行git 的全局配置 用户信息 git config --global ...