1.可变参数列表的简单实现

当调用方法时,方法的参数个数或类型未知时,称其为可变参数列表。在以前的Java代码中,可以使用Object数组来实现这样的功能。因为,所有的类都是直接或间接继承于Object类。
 
VarArgs.java
package sample;
 
class A1{}
 
public class VarArgs {
       static void printArray(Object[] args){
              for(Object obj:args)
                     System.out.print(obj+" ");
              System.out.println();
       }
 
       public static void main(String[] args){
              printArray(new Object[]{
                     new Integer(47),new Float(3.14),new Double(11.11) 
              });
              printArray(new Object[]{"one","two","three"});
              printArray(new Object[]{new A1(),new A1(),new A1()});
       }
}
 
结果:
47 3.14 11.11
one two three
sample.A1@a90653 sample.A1@de6ced sample.A1@c17164
 
这里printArray方法使用Object数组作为参数,并使用foreach语法遍历数组,打印每个对象。
 
2.Java SE5实现可变参数列表
同样的方法,参数可以这样定义,(Object…args),这样达到同样的效果。
 
NewVarArgs.java
package sample;
 
class A{}
 
public class NewVarArgs {
       static void printArray(Object...args){
              for(Object obj:args)
                     System.out.print(obj+" ");
              System.out.println();
       }
 
       public static void main(String[] args){
              printArray(new Integer(47),new Float(3.14),new Double(11.11));
              printArray(47,

              printArray("one","two","three");
              printArray(new A(),new A(),new A());
              printArray((Object[])new Integer[]{1,2,3,4});
              printArray();
       }
}
 
结果:
47 3.14 11.11
47 3.14 11.11
one two three
sample.A@a90653 sample.A@de6ced sample.A@c17164
1 2 3 4
 
这里没有显式的使用数组作为参数,但编译器实际上会为你填充数组。所以同样可以使用foreach语法来遍历之。
注意倒数第二行,编译器已经发现它是一个数组,所以不会在其上执行任何转换。最后一行表明,可以传递零个参数。
也可以指定所有可变参数的类型,下面的程序指定所有可变参数都必须是String。
 
OptionalArguments.java
package sample;
 
public class OptionalArguments {
       static void f(String...trailing){
              for(String s:trailing)
                     System.out.print(s+" ");
              System.out.println();
       }
 
       public static void main(String[] args){
              f("one");
              f("two","three");
              f();
       }
}
 
结果:
one
two three
 
可以在可变参数列表中同时使用原始类型与包装类。
 
AutoboxingVarargs.java
package sample;
 
public class AutoboxingVarargs {
       public static void f(Integer...args){
              for(Integer i:args)
                     System.out.print(i+" ");
              System.out.println();
       }
 
       public static void main(String[] args){
              f(new Integer(1),new Integer(2));
              f(3,4,5,6,7,8,9);
              f(10,new Integer(11),12);
       }
}
 
结果:
1 2
3 4 5 6 7 8 9
10 11 12
 
3.可变参数列表的重载(Overloading)
如果出现重载的情况,则编译器会自动调用最适合的方法匹配之。
 
OverloadingVarargs.java
package sample;
 
public class OverloadingVarargs {
       static void f(Character...args){
              System.out.print("first ");
              for(Character c:args)
                     System.out.print(c+" ");
              System.out.println();
       }
 
       static void f(Integer...args){
              System.out.print("second ");
              for(Integer i:args)
                     System.out.print(i+" ");
              System.out.println();
       }
      
       static void f(Long...args){
              System.out.print("third ");
              for(Long l:args)
                     System.out.print(l+" ");
              System.out.println();
       }
      
       static void f(Double...args){
              System.out.print("forth ");
              for(Double d:args)
                     System.out.print(d+" ");
              System.out.println();
       }
      
       public static void main(String[] args){
              f('a','b','c');
              f(1);
              f(2,1);
              f(0.1);
              f(

       }
}
 
结果:
first a b c
second 1
second 2 1
forth 0.1
third 0
 
但下面的情况是不允许的,即某个方法中增加一个非可变参数。
 
OverloadingVarargs2.java
package sample;
 
public class OverloadingVarargs2 {
       static void f(float i,Character...args){
              System.out.println("first");
       }
 
       static void f(Character...args){
              System.out.println("second");
       }
      
       public static void main(String[] args){
              f(1,'a');
              f('a','b');//Error
       }
}
 
但可以这样解决问题。
package sample;
 
public class OverloadingVarargs2 {
       static void f(float i,Character...args){
              System.out.println("first");
       }
 
       static void f(char c,Character...args){
              System.out.println("second");
       }
      
       public static void main(String[] args){
              f(1,'a');
              f('a','b');
       }
}
即重载的方法必须保持一致的参数形式。

Java 可变参数列表的更多相关文章

  1. <JAVA>可变参数列表

    这是java1.5版本的新特性,就是当你想定义一个方法,但是不知道以后要用的时候传几个参数进去,这时可以在方法的参数列表中这样写(参数类型... 数组名),然后在方法内部直接用操作数组的方式操作.比如 ...

  2. java可变参数列表的实现

    参数就是我们调用一个方法时需要传入得数据,在方法中可能需要参数协助处理数据或者对参数进行解析处理以达到我们希望得到的数据和结果. 平常我们在写一个方法时,我们能确定需要传入什么样的参数以及参数的个数, ...

  3. (四)《Java编程思想》——可变参数列表

    以object数组为参数的方法实现可变参数列表 package chapter5; /** * 以object数组为参数的方法实现可变参数列表 */ class A { } public class ...

  4. 可变参数列表-Java SE5新特性(转)

    Java1.5增加了新特性:可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理.注意:可变参数必须位于最后一项.当可变参数个数多于一个时,必将有一个不是最后一项,所以只支持 ...

  5. “全栈2019”Java第三十四章:可变参数列表

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  6. java基础基础总结----- 构造方法,可变参数列表

    package com.mon11.day2; /** * 类说明 :构造方法,可变参数列表 * @author 作者 : chenyanlong * @version 创建时间:2017年11月2日 ...

  7. java基础(九) 可变参数列表介绍

    一.可变参数简介 在不确定参数的个数时,可以使用可变的参数列表. 1. 语法: 参数类型...(三个点) 例如: void printArray(Object...) 注意: 每个方法最多只有一个可变 ...

  8. Java可变参数 & Python可变参数 & Scala可变参数

    Java 可变参数的特点: (1).只能出现在参数列表的最后: (2)....位于变量类型和变量名之间,前后有无空格都可以: (3).调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体 ...

  9. java可变参数长度

    一: 在python中 有可变参数*args和万能参数**args参数分别为列表和字典.在java中也有类似的可变参数列表.不过传递进去的是可变参数数组. package com.company; p ...

随机推荐

  1. Mysql bench执行sql语句批量操作数据所遇到的问题

    一.错误 rror Code: 1175. You are using safe update mode and you tried to update a table without a WHERE ...

  2. github的git.exe的目录所在

    github的git.exe位于 C:\Users\[username]\AppData\Local\GitHub\PortableGit_25d850739bc178b2eb13c3e2a9faaf ...

  3. 从show slave status 中判断mysql同步状态

    slave status 中检查同步状态: 1.sql线程和io线程显示yes Slave_IO_Running: Yes Slave_SQL_Running: Yes 2. Master_Log_F ...

  4. mysql5.7密码问题

    安装: yum search mysql """mysql-server mysql mysql-devel mysql-community-server"&q ...

  5. HDU 2577

    How to Type Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  6. css问题 ie7兼容性问题

    1.响应式网站用百分比时ie7不兼容:试试将margin:0 10% 改为margin-left:15%; 左边是可以的,但是右边就不行了 2.ie7的span 里的字会出现白色背景 ,是因为没有定高 ...

  7. 【HDU3861 强连通分量缩点+二分图最小路径覆盖】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3861 题目大意:一个有向图,让你按规则划分区域,要求划分的区域数最少. 规则如下:1.有边u到v以及有 ...

  8. const 指针的三种使用方式

    ///////////////////////const 指针的三种状态///////////////////// 注意:const 的前后顺序 const 在类型之前 ---可以修改指针包含的地址, ...

  9. 3_STL算法

    1.常用遍历算法1.1 for_each for_each(v1.begin(),v1.end(),show); void show(int &n) //回调函数的入口地址 { cout &l ...

  10. php使用 memcache 来存储 session 方法总结

    设置session用memcache来存储 方法I: 在 php.ini 中全局设置 session.save_handler = memcache session.save_path = " ...