A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马巩伟伟 黑马帝   /  2011-12-16 18:44  /  2660 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马巩伟伟 于 2011-12-20 00:19 编辑

                public static void show(int...arr)这里可变参数内部是怎么实现的,那个高人给点思路?
        {
            
        }
     大家可能误会我的意思了,我是说为什么int...这样定义的时间就能实现参数可变,具体是怎么实现的? 看老师的视频我就觉得很神奇,它在背后到底是怎么实现可变的。搞不明白。

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

9 个回复

倒序浏览
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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
就数组,就那么简单,就那么直接,思想不复杂,呵呵,,
回复 使用道具 举报
张帅 黑马帝 2011-12-16 22:25:17
板凳
monghuan 发表于 2011-12-16 18:50
arr实际是一个数组,根据调用该方法时传递参数的个数,决定实际数组的大小。 ...

说的很对,如果要实现可变的参数,需要传递一个容器过去,为什么函数里也必须写上类型呢?因为这是形式变量,局部变量,相当于赋值运算,所以必须得定义,写上类型,我是这么理解的,不知道对不对。

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

回复 使用道具 举报
刘健 黑马帝 2011-12-18 20:24:05
报纸
这个参考JDK1.4就知道了,1.4中多个参数就是用数组实现的,所以这里的int...实际上也是实现了数组
回复 使用道具 举报
本帖最后由 程传鹏 于 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中,即可进行下一步运算。

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

回复 使用道具 举报
刘旭 黑马帝 2011-12-19 10:42:01
7#
当调用此方法时,传入参数是可变的。当编译此方法时,编译器会根据传入参数的个数,将参数封装成一个数组,然后共方法内部代码使用。至于具体是怎么封装的,我觉得应该是编译器的事儿吧
回复 使用道具 举报
梁俊 黑马帝 2011-12-19 16:05:36
8#
看不懂题
回复 使用道具 举报
大梅 黑马帝 2011-12-19 16:25:53
9#
我觉得是这样的。在定义方法的时候,写的int ... args是个形参,当具体调用的时候,根据你传入的参数个数,系统才会真正分配指定长度的数组(内存)。个人的理解,有不对的地方,多多指教

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

回复 使用道具 举报
吴上储 黑马帝 2011-12-19 23:35:17
10#

  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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马