先看两个简单的例子,来感受一下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. 线程同步 –AutoResetEvent和ManualResetEvent

    上一篇介绍了通过lock关键字和Monitor类型进行线程同步,本篇中就介绍一下通过同步句柄进行线程同步. 在Windows系统中,可以使用内核对象进行线程同步,内核对象由系统创建并维护.内核对象为内 ...

  2. scala中to和util操作

    // Range:to:默认步进为1 val to1 = 1 to 10 println(to1) // 定义一个不进为2的Range val to2 = 1 to 10 by 2 println(t ...

  3. 我的WAF Bypass实战系列

    ​ 梳理了一下自己写过的WAF Bypass相关的文章,按照编写时间顺序,整理成了一个WAF Bypass实战系列,如果你准备了解WAF攻防这一块的内容,可以来了解一下. 第一篇:<Bypass ...

  4. RF判断列表、字典、整数、字符串类型是否相同方法

      ${d} create list shk shsh${w} create list ${e} evaluate type(${d}) ${t} evaluate type(${w}) should ...

  5. mysql类型对应Java的类型

    整型 JDBCtinyint         java.lang.Integersmallintmediumint       java.lang.Longint          bigint    ...

  6. SpringBoot(二)-- 支持JSP

    SpringBoot虽然支持JSP,但是官方不推荐使用.看网上说,毕竟JSP是淘汰的技术了,泪奔,刚接触 就淘汰.. SpringBoot集成JSP的方法: 1.配置application.prope ...

  7. 第二篇:Hadoop 在Ubuntu Kylin系统上的搭建[图解]

    前言 本文介绍如何在Ubuntu Kylin操作系统上搭建Hadoop平台. 配置 1. 操作系统: Ubuntu Kylin 14.04 2. 编程语言: JDK 1.8 3. 通信协议: SSH ...

  8. codeforces水题100道 第八题 Codeforces Round #274 (Div. 2) A. Expression (math)

    题目链接:http://www.codeforces.com/problemset/problem/479/A题意:给你三个数a,b,c,使用+,*,()使得表达式的值最大.C++代码: #inclu ...

  9. 二叉查找树(BST)的性质

    二叉查找树的性质: 1.左子树上所有结点的值均小于或等于它的根结点的值. 2.右子树上所有结点的值均大于或等于它的根结点的值. 3.左.右子树也分别为二叉排序树. 下图中这棵树,就是一颗典型的二叉查找 ...

  10. nginx+php-fpm 报“File not found.”

    找网上找了很多帖子,大都是说nginx中的$document_root$换成绝对路径,但是依然不能解决问题 后再把php-fpm配置文件中的 [www]下边的 usr = apache group = ...