博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java的不定参数(eg:Object...)(转)
阅读量:7026 次
发布时间:2019-06-28

本文共 2651 字,大约阅读时间需要 8 分钟。

第一个例子: 

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做为参数。 

然后结合重载来看,把第一个例子和第二个例子合并成一个类,得到以下代码: 

1 public class VariArgs {   2    3     public static void main(String[] args) {   4         test();   5         test("aaa");   6         test("aaa", "bbb");   7         test("aaa", "bbb", "ccc");   8     }   9   10     public static void test(String... args) {  11         System.out.println(args.getClass());  12         for (String arg : args) {  13             System.out.println(arg);  14         }  15     }  16   17     public static void test(String arg, String... args) {  18         System.out.println(arg);  19         System.out.println("----------------");  20         for (String s : args) {  21             System.out.println(s);  22         }  23     }  24 }

编译这个程序,结果是编译不通过。为什么?程序编译到第五行时,不能确定test("aaa")该用第10行的test方法还是第17行的方法,因为两个方法都可以有相同的参数列表。都能精确匹配上参数列表,编译器在这种情况下只好报出编译不能通过的错误。所以在重载这样的方法时,注意参数列表,不要使两个方法可以有同样的参数列表。

 

参考:

(以上内容转自此篇文章)

转载地址:http://hxoxl.baihongyu.com/

你可能感兴趣的文章
Servlet 工程 web.xml 中的 servlet 和 servlet-mapping 标签 《转载》
查看>>
数据库读写分离的初步理解
查看>>
[转]window下使用SetUnhandledExceptionFilter捕获让程序的崩溃
查看>>
Codeforces Beta Round #9 (Div. 2 Only) A. Die Roll 水题
查看>>
代码的组织机制
查看>>
html基础之 input:type
查看>>
json-lib简单处理json和对json的简单介绍
查看>>
jquery checkbox选中、改变状态、change和click事件
查看>>
java joor 实现反射简单调用
查看>>
Guava 8-区间
查看>>
自定义Spark Partitioner提升es-hadoop Bulk效率
查看>>
总结一些机器视觉库
查看>>
在CentOS Linux下部署Activemq 5
查看>>
把mysql脚本或其他数据库脚本导入Powerdesigner
查看>>
phalcon 连接多个数据库 phalcon multi-database
查看>>
React Native(十一)——按钮重复点击事件的处理
查看>>
机器学习笔记(4):多类逻辑回归-使用gluton
查看>>
26.angularJS $routeProvider
查看>>
内存映射函数remap_pfn_range学习——示例分析(2)
查看>>
年轻的工程师如何月入伍万XD
查看>>