先看两个简单的例子,来感受一下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. js获取视频截图

    参考:https://segmentfault.com/q/1010000006717959问题:a.获取的好像是第一帧的图?第一帧为透明图时,获取的个透明图片b.得先加载视频到video,做视频上传 ...

  2. 彻底关闭Google的安全搜索

    在使用简体中文的情况下,访问Google总是会跳转到香港,这个时候的安全搜索是无法关闭的. 下面介绍一个最简单的方法,直接使用Google的中文界面:https://www.google.com/we ...

  3. ZooKeeper 未授权访问漏洞

    ZooKeeper 安装: Zookeeper的默认开放端口是2181 wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zooke ...

  4. sharepoint权限操作(记录以备忘)

    using Microsoft.SharePoint; using System; using System.Collections.Generic; using System.Linq; using ...

  5. Synchronizing Threads and GUI in Delphi application

    Synchronizing Threads and GUI   See More About delphi multithreading tthread class user interface de ...

  6. iOS开发-UIImageView响应点击事件

    UIImageView是不能够响应点击事件的,在开发过程中我们需要经常对头像等添加点击事件,上网搜索一番后发现有如下两个方法: 1.找到点击图片Event,添加事件处理函数 UIImageView.u ...

  7. httpClient创建对象、设置超时

    从老版本和新版本进行比较说明: 1.创建HttpClient对象 3.X: HttpClient httpClient = new DefaultHttpClient(); 4.3: Closeabl ...

  8. python cookie

    http://www.jayconrod.com/posts/17/how-to-use-http-cookies-in-python

  9. 项目适配iOS9遇到的一些问题及解决办法(更新两个小问题)

    本文转载至 http://www.bubuko.com/infodetail-1110714.html http://www.jianshu.com/p/631bd7f12a38 1.网络请求报错.升 ...

  10. thrift安装及使用

    下载Thrift:http://thrift.apache.org/download ■ 将thrift-0.11.0.exe重命名为thrift.exe: ■ 解压thrift-0.11.0.tar ...