• 关于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

  • 相关阅读:
    Django之POST GET与前后端交互
    Django中用户权限模块
    Django运算表达式与Q对象/F对象
    Django中Middleware中间件
    Form表单 JSON Content-type解析
    浅析ajax原理与用法
    浅析Django之session与cookie
    浅谈HTTP协议
    Django 项目搭建(ubuntu系统)
    h5 和之前版本的区别
  • 原文地址:https://www.cnblogs.com/hxsyl/p/2966844.html
Copyright © 2020-2023  润新知