先看两个简单的例子,来感受一下Java的不定长度参数

第一个例子:

Java代码  

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);

}

}

}

第二个例子:

Java代码  

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、将不知道前面的不定长度参数有多长, 下一个参数是从哪里开始.

对于第二个参数也是一样,编译器不知道不定长度参数的长度,无法确定从哪里开始下一个参数。

以下是几种不正确使用不定长度参数的例子,请不要这样写程序:

Java代码  

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);

不定参数的方法可以重载。(大家都知道,重载就是方法名相同,而方法的参数列表不同)

下面给出重载的示例:

Java代码  

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

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

Java代码  

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行的方法,因为两个方法都可以有相同的参数列表。都能精确匹配上参数列表,编译器在这种情况下只好报出编译不能通过的错误。所以在重载这样的方法时,注意参数列表,不要使两个方法可以有同样的参数列表。

java 不定参数_Java不定参数相关推荐

  1. java 不定参数_JAVA不定参数探秘

    JAVA中可以使用不定参数, 例如 public void test(String ...args){...} 这里test方法可以传入参数的情况是: 1.不使用参数,如test() 2.使用一个或多 ...

  2. java启动参数_Java启动参数的思考

    1. -XX:+DisableExplicitGC Java在实现RMI Server的时候会通过定时的调System.gc来强制做GC(即使程序里没用到RMI也会被启动),这个动作非常烦人,另外也是 ...

  3. java 什么是参数_java中参数是什么?

    java中参数是什么?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! java中参数是什么? 参数分为实参和形参.方法名 ...

  4. java+list可变参数_Java 可变参数

    众所周知, Java可以通过... 来给一个方法定义一个可变长度的参数. 例如 // 返回可变参数的个数 public void method(int ... i){ System.out.print ...

  5. java变长参数_Java可变长度参数

    术语"varargs"是"variable-length arguments"(可变长度参数)的缩写. 可变长度参数声明一个接受可变数量的参数(或参数)的方法或 ...

  6. java方法的参数_Java方法参数

    Java方法参数 在程序设计语言中如何将参数传给方法(或函数): 按值调用:方法接受的是调用者提供的值 按引用调用:方法接受的是调用者提供的地址 Java程序设计语言总是采用按值调用(方法得到的是所有 ...

  7. java backlog满_java socket参数详解:BackLog

    输入连接指示(对连接的请求)的最大队列长度被设置为 backlog 参数.如果队列满时收到连接指示,则拒绝该连接. 注意: 1. backlog参数必须是大于 0 的正值.如果传递的值等于或小于 0, ...

  8. java方法可选参数_Java可选参数

    java方法可选参数 在Java类中设计方法时,某些参数对于其执行而言可能是可选的. 无论是在DTO,胖模型域对象还是简单的无状态服务类中,可选方法参数都是常见的. 从本文中, 您将学习如何在Java ...

  9. java 接口校验接收参数_java接口参数校验

    (可扩充) 命令编号 命令名称 参数命令 提取现场机时间 上传现场机时间 设置现... 接口标准> (以下简称"接口标准" ) <数据对接接口校验规则> < ...

最新文章

  1. android 自定义listpreference,java-Android,单击ListPreference项时显示对话框
  2. #{}不自动改参数类型_如何在不刷新页面的情况下改变URL
  3. 周立功-成功心法(1):低年级大学生如何查资料写论文
  4. a simple introduce to arontab
  5. 2021年“泰迪杯”数据分析技能B题-肥料登记数据分析赛题
  6. 密码重置用HTML怎么弄,路由器重设密码怎么设置?
  7. 小写金额转为中文大写
  8. 就在这一天,我结束了北漂的生活
  9. HTML进阶--段落标签P --------16岁的小前端
  10. 解三元一次方程c语言,解三元一次方程的c语言程序
  11. 项目管理绝版秘籍——IT项目管理全套127个表格文档
  12. 基于Java实现在线翻译【100010578】
  13. 工具 网络游戏封包基础
  14. c语言考研试题 北京大学,(北大计算机)考研经验贴
  15. 打印报表提示未安装java_解决报表打印各类问题集锦
  16. java语言中修饰一个常量_接口中定义一个常量所用的修饰符有: (5.0分)_学小易找答案...
  17. mongodb文档太大_了解MongoDB BSON文档大小限制
  18. Mac 的程序坞(任务栏)在双屏/多屏 总是跳到其他的屏幕上
  19. html页面禁止返回代码,多页面网站禁用浏览器后退键
  20. 5G带火了一项黑科技,那就是散热垫片,然而材料却由美日垄断

热门文章

  1. 什么是哲学为基础的设计模式?
  2. LinQ学习之旅(1)
  3. 面前的大山一座接一座
  4. Python框架篇之Django(Django项目搭建全过程、Web框架与Django)
  5. qbittorrent container 改共享文件_SSH连接docker中的container
  6. Python 3.8实现支持断点续传的网络文件下载功能
  7. Python编程一定要注意的那些“坑”(九):0与False
  8. 1900页Python系列PPT分享四:字符串与正则表达式(109页)
  9. java编码转换报错_Java中BeanUtils的日期转换 代码报错 怎么解决
  10. qt show widget_QWidgetStack类 - Qt 参考中文帮助文档