不定参数(...)省略号的使用
来源:互联网 发布:美容师必备的软件 编辑:程序博客网 时间:2024/05/29 14:38
先看两个简单的例子,来感受一下Java的不定长度参数
第一个例子:
第二个例子:
读者可以自己运行一下,这个不定长度参数的类型为String[],即字符串数组。
从上面可以看出,如果一个方法的参数定为不定参数的话,这个参数可以根据参数个数动态生成一个数组,然后传入方法执行。
不过,不定参数有两个规定:第一,方法的参数列表中最多只有一个不定长度的参数;第二,就是不定长度的数组的位置必须是最后一个参数。不然不能通过编译。
对于第一个规定,是因为如果有多于一个不定长度的参数,当真正调用这个方法的时候,JVM、将不知道前面的不定长度参数有多长, 下一个参数是从哪里开始.
对于第二个参数也是一样,编译器不知道不定长度参数的长度,无法确定从哪里开始下一个参数。
以下是几种不正确使用不定长度参数的例子,请不要这样写程序:
不定参数的方法可以重载。(大家都知道,重载就是方法名相同,而方法的参数列表不同)
下面给出重载的示例:
读者如果细心的话,可以看出文章开头给出的两个例子的区别,就是第二个例子比第一个例子的test方法的参数多出了一个String arg,从感觉上没有太大的区别,这有点像编译原理的*和+的区别。第一个test方法指可以有0或N个String做参数,但第二个test方法指至少一个String做为参数。
然后结合重载来看,把第一个例子和第二个例子合并成一个类,得到以下代码:
读者可以编译下这个程序,结果是编译不通过。为什么呢?程序编译到第五行时,不能确定test("aaa")该用第10行的test方法还是第17行的方法,因为两个方法都可以有相同的参数列表。都能精确匹配上参数列表,编译器在这种情况下只好报出编译不能通过的错误。所以在重载这样的方法时,注意参数列表,不要使两个方法可以有同样的参数列表。
第一个例子:
- public class VariArgs {
- public static void main(String[] args) {
- test();
- test("aaa");
- test("aaa", "bbb");
- test("aaa", "bbb", "ccc");
- }
- public static void test(String... args) {
- System.out.println(args.getClass());
- for (String arg : args) {
- System.out.println(arg);
- }
- }
- }
第二个例子:
- public class VariArgs {
- public static void main(String[] args) {
- test("aaa");
- test("aaa", "bbb");
- test("aaa", "bbb", "ccc");
- }
- public static void test(String arg, String... args) {
- System.out.println(arg);
- System.out.println("----------------");
- for (String s : args) {
- System.out.println(s);
- }
- }
- }
读者可以自己运行一下,这个不定长度参数的类型为String[],即字符串数组。
从上面可以看出,如果一个方法的参数定为不定参数的话,这个参数可以根据参数个数动态生成一个数组,然后传入方法执行。
不过,不定参数有两个规定:第一,方法的参数列表中最多只有一个不定长度的参数;第二,就是不定长度的数组的位置必须是最后一个参数。不然不能通过编译。
对于第一个规定,是因为如果有多于一个不定长度的参数,当真正调用这个方法的时候,JVM、将不知道前面的不定长度参数有多长, 下一个参数是从哪里开始.
对于第二个参数也是一样,编译器不知道不定长度参数的长度,无法确定从哪里开始下一个参数。
以下是几种不正确使用不定长度参数的例子,请不要这样写程序:
- public static void test(Object... objs, Object obj);
- public static void test(Object obj1, Object... objs, Object obj2);
- public static void test(Object... objs1, Object... objs2);
不定参数的方法可以重载。(大家都知道,重载就是方法名相同,而方法的参数列表不同)
下面给出重载的示例:
- public class VariArgs {
- public static void main(String[] args) {
- test("aaa");
- test("aaa", "bbb");
- test("aaa", "bbb", "ccc");
- }
- public static void test(Object... args) {
- }
- public static void test(String arg, String... args) {
- }
- }
读者如果细心的话,可以看出文章开头给出的两个例子的区别,就是第二个例子比第一个例子的test方法的参数多出了一个String arg,从感觉上没有太大的区别,这有点像编译原理的*和+的区别。第一个test方法指可以有0或N个String做参数,但第二个test方法指至少一个String做为参数。
然后结合重载来看,把第一个例子和第二个例子合并成一个类,得到以下代码:
- public class VariArgs {
- public static void main(String[] args) {
- test();
- test("aaa");
- test("aaa", "bbb");
- test("aaa", "bbb", "ccc");
- }
- public static void test(String... args) {
- System.out.println(args.getClass());
- for (String arg : args) {
- System.out.println(arg);
- }
- }
- public static void test(String arg, String... args) {
- System.out.println(arg);
- System.out.println("----------------");
- for (String s : args) {
- System.out.println(s);
- }
- }
- }
读者可以编译下这个程序,结果是编译不通过。为什么呢?程序编译到第五行时,不能确定test("aaa")该用第10行的test方法还是第17行的方法,因为两个方法都可以有相同的参数列表。都能精确匹配上参数列表,编译器在这种情况下只好报出编译不能通过的错误。所以在重载这样的方法时,注意参数列表,不要使两个方法可以有同样的参数列表。
阅读全文
0 0
- 不定参数(...)省略号的使用
- 不定参数的使用
- 不定参数的使用
- 分享:C语言的三种不定参数,省略号用法
- 不定(个数)参数的使用
- C、C++不定参数的使用
- Java中不定参数的使用
- java不定长参数的简单使用
- c语言不定参数的使用
- C、C++不定参数的使用
- java不定长参数的简单使用
- .Net中俩种使用不定参数的方法
- C语言 不定参数的简单使用
- java不定长参数的简单使用
- C语言,不定参数的使用
- C、C++不定参数的使用
- c 函数不定参数(不限参数)使用实例 不定参数输出函数
- 不定参数的应用
- Naked推智能健身镜能帮助女性更好的控制体型
- 阿里巴巴Java开发手册要点笔记 (一)
- 微信公众平台开发(76) 获取用户基本信息
- 设计模式系列--抽象工厂模式
- 移动前端开发与web前端开发的区别
- 不定参数(...)省略号的使用
- 171011——作业1:平均数 & 学习C++的第二堂课之后。
- Eventbus
- 网站性能优化
- 解密SVM系列(五):matlab下libsvm的简单使用:分类与回归
- 正则表达式之match、replace
- 定义DNS、IP|UDP结构体,使用libpcap处理数据包
- Python初学知识点(1)
- C++封装dll并用C#调用(范例),解决C#调用C++的dll找不到入口点异常