关于Java可变参数的若干问题

  Java1.5增加了新特性:可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理。注意:可变参数必须位于最后一项。当可变参数个数多余一个时,必将有一个不是最后一项,所以只支持有一个可变参数。因为参数个数不定,所以当其后边还有相同类型参数时,java无法区分传入的参数属于前一个可变参数还是后边的参数,所以只能让可变参数位于最后一项。
可变参数的特点:
 
  (1)只能出现在参数列表的最后;
  (2)...位于变量类型和变量名之间,前后有无空格都可以;
  (3)调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中一数组的形式访问可变参数。

 1 public class TestVarArgus {
 2     public static void dealArray(int... intArray){
 3         for (int i : intArray)
 4             System.out.print(i +" ");
 5
 6         System.out.println();
 7     }
 8
 9     public static void dealArray(int[] intArray){//会有Duplicate method dealArray(int[]) in type TestVarArgus的错误
10         for (int i : intArray)
11             System.out.print(i +" ");
12
13         System.out.println();
14     }
15
16     public static void main(String args[]){
17         dealArray();
18         dealArray(1);
19         dealArray(1, 2, 3);
20     }
21 }

 输出:
1
1 2 3

  通过main方法里的调用,可以看出来这个可变参数既可以是没有参数(空参数),也可以是不定长的。看到这里估计都能明白,这个不定长的参数其实和数组参数挺像的。事实上,也确实是这么回事儿。编译器会在悄悄地把这最后一个形参转化为一个数组形参,并在编译出的class文件里作上一个记号(我倒没发现文件名有类似内部类那样的标志),表明这是个实参个数可变的方法。

  从上面这段代码可以看出,这两个方法是冲突的,是无法重载的。到这里,再来做一个有意思的实验:从上面这段代码可以看出,这两个方法是冲突的,是无法重载的。到这里,再来做一个有意思的实验:

 1 public class TestVarArgus {
 2     public static void dealArray(int... intArray){
 3         for (int i : intArray)
 4             System.out.print(i +" ");
 5
 6         System.out.println();
 7     }
 8
 9     public static void main(String args[]){
10         int[] intArray = {1, 2, 3};
11
12         dealArray(intArray);  //通过编译,正常运行
13     }
14 }
 1 public class TestVarArgus {
 2     public static void dealArray(int[] intArray){
 3         for (int i : intArray)
 4             System.out.print(i +" ");
 5
 6         System.out.println();
 7     }
 8
 9     public static void main(String args[]){
10         dealArray(1, 2, 3);  //编译错误
11     }
12 }

  从上面这两段代码可以看出来,可变参数是兼容数组类参数的,但是数组类参数却无法兼容可变参数。其实对于第二段代码而言,编译器并不知道什么可变不可变,在它看来,需要定义一个dealArray(int, int, int)类的方法。所以,自然就无法去匹配数组类参数的dealArray方法了。

 1 public class TestVarArgus {
 2     public static void dealArray(int... intArray){
 3         System.out.println("1");
 4     }
 5
 6     public static void dealArray(int count, int count2){
 7         System.out.println("2");
 8     }
 9
10     public static void main(String args[]){
11         dealArray(1, 2);
12     }
13 }

  代码贴出来估计都知道是输出2,而不是1。记住:能匹配定长的方法,那么优先匹配该方法。含有不定参数的那个重载方法是最后被选中的。最后,大家都知道main方法的参数就是一个数组类型的,那么它其实也是可以改成不定参数类型。

 1 public class Varable {
 2  public static void main(String [] args){
 3   System.out.println(add(2,3));
 4   System.out.println(add(2,3,5));
 5  }
 6  public static int add(int x,int ...args){
 7   int sum=x;
 8   for(int i=0;i<args.length;i++){
 9    sum+=args[i];
10   }
11   return sum;
12  }
13 }

 

   参考文献:http://blog.csdn.net/justinavril/article/details/4674305

时间: 2024-10-28 06:42:18

关于Java可变参数的若干问题的相关文章

Thinking in java 可变 参数列表问题,请各位帮忙解决。

问题描述 Thinking in java 可变 参数列表问题,请各位帮忙解决. public class OverloadingVarargs3 { static void f(float i Character... args) { System.out.println(""first""); } static void f(char c Character... args) { System.out.println(""second&quo

java可变参数使用示例_java

Java1.5增加了新特性:可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理.注意:可变参数必须位于最后一项.当可变参数个数多余一个时,必将有一个不是最后一项,所以只支持有一个可变参数.因为参数个数不定,所以当其后边还有相同类型参数时,java无法区分传入的参数属于前一个可变参数还是后边的参数,所以只能让可变参数位于最后一项. 可变参数的特点: 1.只能出现在参数列表的最后: 2....位于变量类型和变量名之间,前后有无空格都可以: 3.调用可变参数的方法时,编译器

浅谈Java中的可变参数_java

可变参数 可变参数就是一个方法可以接收任意多个参数!例如:fun().fun(1).fun(1,1).fun(1,1,1).你可能认为这是方法重载,但这不是重载,你想想重载能重载多少个方法,而fun()方法是可以传递任何个数的参数,你能重载这么多个方法么? 2.1 定义可变参数方法 public voidfun(int- arr) {} 上面方法fun()的参数类型为int-,其中"-"不是省略号,而是定义参数类型的方式.参数arr就是可变参数类型.你可以把上面代码理解为:public

Java方法的可变参数类型实例分析_java

Java方法中的可变参数类型是一个非常重要的概念,有着非常广泛的应用.本文就以实例形式对此加以分析.具体如下: 一般来说,许多Java初学者在看到下面的这段代码的时候,都会问一个问题:dealArray方法里那三个小点点是什么啊? public class TestVarArgus { public static void dealArray(int... intArray){ } public static void main(String args[]){ } } 这就是本文所要讨论的问题:

Java中支持可变参数详解_java

意思就是:参数的个数可以根据需要写,你可以写1个.2个.3个....他们都被保存到一个参数的数组中. 但是这些参有一些约束:他们必须是同类型的,比如都是String字符串类型. 同时,可变参数的函数中的参数的写法也有约束:比如,可变参数的数组必须写在参数的最后,否则程序不知道你的参数到底有多少个. 例子:输出可变参数中的参数值 public class VariableArgument { public static void main(String[] args) { printArgumen

java-[Java]可变参数列表的参数传递

问题描述 [Java]可变参数列表的参数传递 想问一下,可变参数列表Object... a 和 Object[] a 这两种写法到底有啥区别呢? class Abc{ } public class AboutObject { static void pr(Object... a){ //Object[] a for(Object i:a) System.out.print(i+" "); } public static void main(String[] args){ Object[

JRuby中调用java带可变参数的方法

今天同事遇到的问题,用JRuby调用一个java方法,该方法使用了jdk1.5的可变参数.我一开始以为只要简单地将可变参数表示为数组即可,例如下面的两个java类: public class Echo{ public void echo(String name){ System.out.println(name); } } public class Test{ public void hello(String name,Echoargs){ System.out.println("hello,&

如何应用Java的可变参数

Java语言在JDK1.5中首次推出可变参数,variable arguments,或简称varargs.这一新语言特征给软件开发人员在编写方法重载时提供了方便和灵活性.但可变参数的应用并不像想象的那么简单,使用时有其特殊要求和局限性. 重载的最好例子 读者朋友可能有这样的编程经历:在编写一个方法时,其参数随着程序运行的条件而变化,在编译期间无法确定.具体地讲,例如编写一个打印参加聚会party的程序,其中方法printInvitation()将根据作为参数的参加人姓名,打印邀请卡.但这个参数的

C#与Java对比学习:数据类型、集合类、栈与队列、迭达、可变参数、枚举

数据类型:   C#:String与StringBuilder Java:String与StringBuffer 第一个不习惯是string的第一个字母必须大写了. 第二个不习惯是int得写成Integer了,虽然可以定义int i=0,但是对于泛型等用法必须ArrayList<Integer>. 常用集合类比较:   C#  :HashTable         List<T>