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

  1. public class VariArgs {
  2. public static void main(String[] args) {
  3. test();
  4. test("aaa");
  5. test("aaa", "bbb");
  6. test("aaa", "bbb", "ccc");
  7. }
  8. public static void test(String... args) {
  9. System.out.println(args.getClass());
  10. for (String arg : args) {
  11. System.out.println(arg);
  12. }
  13. }
  14. }

第二个例子:

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

读者可以自己运行一下,这个不定长度参数的类型为String[],即字符串数组。 
从上面可以看出,如果一个方法的参数定为不定参数的话,这个参数可以根据参数个数动态生成一个数组,然后传入方法执行。 
    不过,不定参数有两个规定:第一,方法的参数列表中最多只有一个不定长度的参数;第二,就是不定长度的数组的位置必须是最后一个参数。不然不能通过编译。 
    对于第一个规定,是因为如果有多于一个不定长度的参数,当真正调用这个方法的时候,JVM、将不知道前面的不定长度参数有多长, 下一个参数是从哪里开始. 
    对于第二个参数也是一样,编译器不知道不定长度参数的长度,无法确定从哪里开始下一个参数。 
    以下是几种不正确使用不定长度参数的例子,请不要这样写程序:

  1. public static void test(Object... objs, Object obj);
  2. public static void test(Object obj1, Object... objs, Object obj2);
  3. public static void test(Object... objs1, Object... objs2);

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

  1. public class VariArgs {
  2. public static void main(String[] args) {
  3. test("aaa");
  4. test("aaa", "bbb");
  5. test("aaa", "bbb", "ccc");
  6. }
  7. public static void test(Object... args) {
  8. }
  9. public static void test(String arg, String... args) {
  10. }
  11. }

读者如果细心的话,可以看出文章开头给出的两个例子的区别,就是第二个例子比第一个例子的test方法的参数多出了一个String arg,从感觉上没有太大的区别,这有点像编译原理的*和+的区别。第一个test方法指可以有0或N个String做参数,但第二个test方法指至少一个String做为参数。 
   然后结合重载来看,把第一个例子和第二个例子合并成一个类,得到以下代码:

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

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

Java不定参数的更多相关文章

  1. Java不定参数Object… obj 和 Object[] 的区别

    Java不定参数Object… obj 和 Object[] 的区别 简述: java中方法重载可以实现参数不同自动匹配对应方法.但现实中也存在这种问题.普通传参对于形如下面的方法,却显得臃肿而失优雅 ...

  2. 有关 java 不定参数

    不定参数实际为数组参数的一种写法而已,本质上与数组参数完全相同 //1.数组参数函数 public static int sum(int[] values) { } //2.不定参数函数 不定参数只能 ...

  3. java不定参数列表---乔老师没讲,但是传智有讲

    **public static void sum(int i,int...srgs){** package com.xml; public class dremo1 { public static v ...

  4. Java的不定参数(eg:Object...)(转)

    第一个例子: public class VariArgs { public static void main(String[] args) { test(); test("aaa" ...

  5. Java:参数数量可变的方法

    许多Java新人在看到下面的这段代码的时候,都会问一个问题:dealArray方法里那三个小点点是什么啊? [java] view plaincopy public class TestVarArgu ...

  6. golang 防SQL注入 基于反射、TAG标记实现的不定参数检查器

    收到一个任务,所有http的handler要对入参检查,防止SQL注入.刚开始笨笨的,打算为所有的结构体写一个方法,后来统计了下,要写几十上百,随着业务增加,以后还会重复这个无脑力的机械劳作.想想就l ...

  7. 深度解析Java可变参数类型以及与数组的区别

    注意:可变参数类型是在jdk1.5版本的新特性,数组类型是jdk1.0就有了. 这篇文章主要介绍了Java方法的可变参数类型,通过实例对Java中的可变参数类型进行了较为深入的分析,需要的朋友可以参考 ...

  8. golang中不定参数与数组切片的区别

    package main import "fmt" func main() { myfunc1(, , , ) //传递不定数量的参数 myfunc2([], , , }) //传 ...

  9. java函数参数默认值

    java函数参数默认值 今天,需要设定java函数参数的默认值,发现按照其它语言中的方法行不通 java中似乎只能通过函数的重载来实现 函数参数默认代码

随机推荐

  1. Java实现两个变量的互换(不借助第3个变量)

    创建一个类,在该类中定义两个变量并为其指定初始值,然后交换两个变量的值,要求不允许借助第三个变量,只能使用异或运行实现两个变量值的交换. import java.util.Scanner; publi ...

  2. 5 -- Hibernate的基本用法 --2 2 Hibernate的数据库操作

    在所有的ORM框架中有一个非常重要的媒介 : PO(持久化对象:Persistent Object).持久化对象的作用是完成持久化操作,简单地说,通过该对象可对数据执行增.删.改的操作 ------ ...

  3. hive-数据模型

    hive支持四种数据模型 • external table• table• partition• bucket 为了避免table名称冲突,hive用database作为顶层域名,如果不设定datab ...

  4. Unity3D Shader官方教程翻译(十九)----Shader语法,编写表面着色器

    Writing Surface Shaders Writing shaders that interact with lighting is complex. There are different ...

  5. map 集合的遍历

    List<Map<String,Object>> autoReplyList= wechatService.queryAutoReplyByOrg(orgId); for(Ma ...

  6. 从Eclipse转移到IntelliJ IDEA的一点心得

    IntelliJ使用指南—— 深入理解IntelliJ的Web部署逻辑 Intellij IDEA 部署Web项目,解决 404 错误 Intellij IDEA快捷键的使用 本文转载地址 本人使用I ...

  7. GNU Readline库函数的应用示例

    说明 GNU Readline是一个跨平台开源程序库,提供交互式的文本编辑功能.应用程序借助该库函数,允许用户编辑键入的命令行,并提供自动补全和命令历史等功能.Bash(Bourne Again Sh ...

  8. Esper学习之三:进程模型

    之前对Esper所能处理的事件结构进行了概述,并结合了例子进行讲解,不清楚的同学请看Esper学习之二:事件类型.今天主要为大家解释一下Esper是怎么处理事件的,即Esper的进程模型. 1.Upd ...

  9. QT开发之旅一DS7400主机调试工具

    接触QT三年有余,期间因为工作需要断断续续学习过,2010年开始接触,当时好像是4.7版本,现在都已经到5.2版本了,更新真快,前阵子安装了下5.2版本,还是有很多变化的,不过感觉好像编译速度慢了很多 ...

  10. 【大数据系列】hadoop单节点安装官方文档翻译

    Hadoop: Setting up a Single Node Cluster. HADOOP:建立单节点集群 Purpose Prerequisites Supported Platforms R ...