以前一直以为java方法的参数个数是编译期已知的,有些羡慕可以乱加实参C#和变态的js.后来无意中发现了java方法签名中竟然有"..."这种写法.事实上,java方法的参数数目也可以是不固定的,直到运行时.
比如main方法的签名其实可以这样写:
public static void main(String... args)//方法1
它也可以运行.
并且,如果同时还存在
public static void main(String[] args)//方法2
会报已经存在重复的方法的错误.
由此可见,String... args跟String[] args对于虚拟机来说其实是一回事.
而且,在方法内,通过...传进来的参数的使用方法也跟一个数组完全无二,可以for循环,甚至可以直接转换:
public static void main(String... args)
{
String[] ss=args;
}
但对于程序员来说却还是有差别的.
1.调用
我们只能这样调用方法2:
main(new String[]{});
即,方法2只能接受String数组做参数.
而我们陌生的方法1可强了,用以下参数调用,照单全收:
main();
main(null);
main(null,null);
main(null,null,null);
......
main("a");
main("a","b");
main("a","b","c");
......
main(new String[]{});
(String...匹配String*,而null也可以是一个特殊的String)
2.参数位置
使用...的参数只能是最后一个参数.不然谁知道你调用的时候,点点点匹配到哪个实参?
public static void main(String[] args,int index)//可以
public static void main(String... args,int index)//不行!
3.重载
假设有以下两个方法:
public static void main(String... args)//方法1
public static void main(String a,String... args)//方法3
从语法上来看,这个重载完全没有错误,eclipse也没有报错.但是当调用时使用的参数个数大于这些方法中点点点参数前面的参数个数时,eclipse就会发现这个错误了.很拗口是不是?嘿嘿~还是举例来说吧.以上这两个方法,如果调用时
main();
编译器会认出这个调用的是方法1.但是如果调用时
main("");
编译器就疯了...因为一个String参数,既符合方法1的点点点,也符合方法3的String+点点点,编译器就不知道调用的是哪个方法了.
String[]参数不会有这种问题.
所以重载时要注意,如果点点点参数前面有跟它类型相同的参数...最好的方法,似乎就是换回数组形式了,要么就给方法改个名字吧.
4.遇上泛型加外包
用个实例来说
java.util.Arrays是个工具类,所有方法都是静态的,对数组的操作.里面有个方法asList(T... args),用来把类型T的数组转化成List<T>.
这是个很有用的方法,在绝大多数情况下都能如你所愿.
但是,你可以试试下面的写法
int[] is=...//自定义的数组,或者从什么地方获取来的数组
List<Integer> list=Arrays.asList(is);
很不幸,不要说执行,编译都通不过.错误的意思大概是:
不能将List<int[]>转化成List<Integer>
明白了吧?
你的设想是,把int[]中的每一个元素对应T...中的每一个点,
可编译器不这么想.因为int是原始类型,不是Object的子类.而泛型T隐含的条件是T extends Object.所以编译器不会把每一个int看做T,不会把int[]看做T点点点.虽然java已经支持自动将原始类型封包成外包类,但那是单个的情况.
而数组(不管什么类型)则是一种特殊的类型,是Object的子类,所以编译器觉得整个int[]对应一个T,你调用的方法是asList<int[]>(int[]... args)而不是你想象中的asList<Integer>(Integer...)
分享到:
相关推荐
Java可变参数列表,也称为不定参数,是Java语言中的一种特性,允许方法接收数量可变的参数。这种特性在编程时提供了极大的灵活性,尤其是在处理不确定数量输入的情况下。以下是关于Java可变参数列表的详细解释。 1....
Java可变参数是Java语言中一个非常实用的特性,它允许方法接受数量可变的参数。这个特性在Java 5中被引入,极大地提高了代码的灵活性和可读性。下面我们将详细探讨Java可变参数的概念、用法以及背后的实现原理。 ##...
Java数组传递及可变参数操作实例详解 Java 数组传递是指在方法之间传递数组对象的引用,而不是传递数组对象本身。这意味着,方法中对数组的修改将会影响原数组。在 Java 中,所有对象都是通过引用进行操作的,而...
10.java可变参数.zip10.java可变参数.zip10.java可变参数.zip10.java可变参数.zip10.java可变参数.zip10.java可变参数.zip10.java可变参数.zip10.java可变参数.zip10.java可变参数.zip10.java可变参数.zip10.java可...
本文将探讨一个共同的话题——如何在C和Java中定义可变参数列表的函数。可变参数列表,也称为不定参数或可变参数,允许函数接受不同数量的参数,增加了代码的灵活性。 在C语言中,可变参数列表的实现依赖于`stdarg....
在这个名为"Java可变参数demo"的示例中,开发者通过分析Android蓝牙框架层的源码,对Java的可变参数有了更深入的理解,并编写了一个小的演示程序以备后用。下面我们将详细探讨Java可变参数的相关知识点。 1. 可变...
Kotlin传递可变长参数给Java可变参数实例代码 Kotlin是一种现代化的静态类型语言,运行于Java虚拟机上,能够与Java语言进行无缝集成。在实际开发中,我们经常需要在Kotlin和Java之间进行交互,特别是在调用Java方法...
可变参数的另一个需要注意的点是,一个方法中只能有一个可变参数,并且可变参数必须是方法参数列表中的最后一个参数。这是为了避免在调用方法时可能出现的混淆。 总结来说,Java的可变参数提供了一种灵活的方式来...
总之,Java可变参数简化了处理可变数量参数的方法定义和调用,使得代码更加简洁,同时也保留了数组的灵活性。在实际开发中,尤其是在需要处理命令行参数、集合数据等场景下,可变参数是一个非常实用的特性。
arr)` 定义了一个名为 `sum` 的静态方法,该方法接收一个可变参数列表 `arr`。这里的 `int... arr` 表示可以传入任意多个整型数值。需要注意的是,在Java中,可变参数只能位于参数列表的最后,并且只能有一个可变...
Java可变参数(Varargs)是一种语言特性,允许方法接受可变数量的参数。在方法声明中使用省略号(...) 表示,可以将不定数量的参数传递给方法。可变参数使得方法更加灵活,可以接受任意数量的参数,并以数组形式访问...
Java中的可变参数常见用法实例总结 Java中的可变参数是一种特殊的参数类型,允许在方法中传递可变数量的参数。下面是Java中的可变参数常见用法实例总结: 一、可变参数的概念 在J2SE 1.4之前,Java中无法定义实参...
- **函数式编程**:在高阶函数中,可变参数可以接受一个函数执行的参数列表。 - **集合操作**:在处理集合类库时,可变参数可以方便地将多个元素添加到集合中,如 `List<String> list = new ArrayList(Arrays....
Java可变参数当做数组处理的方法示例 Java可变参数当做数组处理的方法示例主要介绍了Java可变参数当做数组处理的相关原理、步骤与操作注意事项。本文将通过实例形式对Java可变参数当做数组处理的方法进行详细讲解,...
一个方法只能有一个可变参数,并且它必须是方法参数列表的最后一个参数。不能有其他参数紧跟在可变参数之后。 6. **应用场景**: - 当你需要一个方法处理不确定数量的数据,比如计算平均值、最大值或最小值。 - ...
3. **唯一性**:在一个方法签名中,可变长参数只能出现一次,并且必须是所有参数列表中的最后一个。这意味着你不能在其他参数之后再定义一个可变长参数。 4. **类型安全**:虽然可变长参数看起来像是接受任意数量的...
Java的可变参数列表(Variable Argument List),也称为varargs,是自Java 5引入的一项特性,它允许方法接受一个可变数量的参数。这种机制使得编写接受任意数量相同类型参数的方法变得更加方便。在使用可变参数时,...
Java 可变参数是Java 5.0引入的一项新特性,它允许我们在方法签名中使用一个带有省略号(...)的参数,使得该方法能够接收任意数量的相同类型的参数。这种特性使得方法调用更加灵活,同时也简化了处理不定数量参数的...
Java中的可变参数(Variable Arguments)是编程中一个便利的功能,允许我们在方法声明时定义一个可以接受任意数量相同类型参数的参数列表。这种特性在处理不确定数量输入时非常有用,比如函数式编程中的高阶函数。 ...
下面我们将深入探讨Java可变参数的工作原理、语法以及如何在实际项目中应用。 1. 可变参数的语法: 可变参数的声明方式是在参数类型后面加上三个点(...)。例如,以下是一个简单的可变参数方法,用于计算整数之和...