黑马程序员技术交流社区

标题: 一个可变参数的问题,求解 [打印本页]

作者: 黑马巩伟伟    时间: 2011-12-16 18:44
标题: 一个可变参数的问题,求解
本帖最后由 黑马巩伟伟 于 2011-12-20 00:19 编辑

                public static void show(int...arr)这里可变参数内部是怎么实现的,那个高人给点思路?
        {
            
        }
     大家可能误会我的意思了,我是说为什么int...这样定义的时间就能实现参数可变,具体是怎么实现的? 看老师的视频我就觉得很神奇,它在背后到底是怎么实现可变的。搞不明白。
作者: 刘基军    时间: 2011-12-16 18:50
arr实际是一个数组,根据调用该方法时传递参数的个数,决定实际数组的大小。
  1. class Test
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.           System.out.println(add(100,200));
  6.           System.out.println(add(100,200,300));
  7.         }
  8.         public static int add(int... a)
  9.         {
  10.           int num=0;
  11.           System.out.println(a.length);
  12.           for(int i=0;i<a.length;i++)
  13.           {
  14.                   num=num+a[i];        
  15.           }
  16.           return num;
  17.         }
  18. }
复制代码

作者: 小春同学    时间: 2011-12-16 19:25
就数组,就那么简单,就那么直接,思想不复杂,呵呵,,
作者: 张帅    时间: 2011-12-16 22:25
monghuan 发表于 2011-12-16 18:50
arr实际是一个数组,根据调用该方法时传递参数的个数,决定实际数组的大小。 ...

说的很对,如果要实现可变的参数,需要传递一个容器过去,为什么函数里也必须写上类型呢?因为这是形式变量,局部变量,相当于赋值运算,所以必须得定义,写上类型,我是这么理解的,不知道对不对。
作者: 刘健    时间: 2011-12-18 20:24
这个参考JDK1.4就知道了,1.4中多个参数就是用数组实现的,所以这里的int...实际上也是实现了数组
作者: 程传鹏    时间: 2011-12-19 07:27
本帖最后由 程传鹏 于 2011-12-19 07:28 编辑

public static void show(int...arr)这里可变参数内部是怎么实现的,那个高人给点思路?
        {
            
        }
     大家可能误会我的意思了,我是说为什么int...这样定义的时间就能实现参数可变,具体是怎么实现的? 看老师的视频我就觉得很神奇,它在背后到底是怎么实现可变的。搞不明白。
楼主要是想知道的话,我们还原出一个对这样定义方式的接收的原代码的思路,即,int...arr背后不为人知的故事,{:soso_e113:}
本人水平有限,自己分析如下:
  当我们定义了 public static void show(int...arr),当 public static void show(int...arr)被调用时,会有不定个数的参数传进来,
   我们在使用int...arr时,设立一个变量parem一个一个的去接收参数,设立一个计数器count=-1;
     每当parem接收一个参数,count++,arr[count]=parem;
    当parem返回的是null时,说明参数全部接收完了,这时,所有参数都传进数组arr中,即可进行下一步运算。
作者: 刘旭    时间: 2011-12-19 10:42
当调用此方法时,传入参数是可变的。当编译此方法时,编译器会根据传入参数的个数,将参数封装成一个数组,然后共方法内部代码使用。至于具体是怎么封装的,我觉得应该是编译器的事儿吧
作者: 梁俊    时间: 2011-12-19 16:05
看不懂题
作者: 大梅    时间: 2011-12-19 16:25
我觉得是这样的。在定义方法的时候,写的int ... args是个形参,当具体调用的时候,根据你传入的参数个数,系统才会真正分配指定长度的数组(内存)。个人的理解,有不对的地方,多多指教
作者: 吴上储    时间: 2011-12-19 23:35

  1. public class A{
  2.       public static void main(String[] args){
  3.                 int a = add(1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
  4.         int b = add(1,2,3,4,5);
  5.         System.out.println(a+" "+b);

  6. }
  7. public static int add(int...v){
  8.                 int sum = 0;
  9.                 for(int x : v){
  10.                         sum =sum+ x;
  11.                 }
  12.                 return sum;
  13.         }
  14. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2