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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马十八期0513 中级黑马   /  2013-1-7 10:39  /  1578 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 姜伟 于 2013-1-7 11:44 编辑

一个很简单的代码,之前一直没有在意+=运算,这次自己动手被这个问题给难住了。
public class VarableParameter {
         public static void main(String[]args){
                             int a= add(2,3);
                             int b =add(2,3,5);                  
                    }

      public static int add(int x,int y,int...args){
                  int sum =x;
                  for(int i=0;i<args.length;i++){
                     sum +=args;
                      }
                return sum;
              }
}

为什么运行的结果,a =2,b=7?很不解,这个到底是怎么运算的?
按照我的理解应该是   
int sum =2;
     sum +=args[0]  =4      sum =4;
     sum +=args[1] =7      sum =7;
a的值为7才对,同理b的值也应该是12才对,不知道是哪儿想错了。

评分

参与人数 1技术分 +1 收起 理由
金鑫 + 1 赞一个!

查看全部评分

10 个回复

倒序浏览
sum +=args[i];
就是 sum=sum+args[i]    暂时只知道这么多,因为还没学到楼主那里,共勉
回复 使用道具 举报
哥们啊,可变数组的定义只能放在参数最后,而你取的是可变数组的长度,add(2,3)这里,x=2,y=3,没有可变参数,
所以长度为0,而add(2,3,5),x=2,y=3,可变数组的长度为1,就是5,你的for循环中,遍历的只是可变数组,所以加的
只是可变数组的值了,而x和y并没有加。

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
徐帅 发表于 2013-1-7 10:52
哥们啊,可变数组的定义只能放在参数最后,而你取的是可变数组的长度,add(2,3)这里,x=2,y=3,没有可变参 ...

谢谢哥们,明白了,是我自己理解的不透彻,非常感谢,要不然可变参数这一重要内容我就掌握不好了!
回复 使用道具 举报
本帖最后由 胡勇敏 于 2013-1-7 11:10 编辑

int a= add(2,3);
这句运行时 你传递给add方法的参数智能匹配add方法的前两个参数,而最后一个可变参数默认为一个空数组,所以你for循环中的i<args.length本身就不成立 不进行循环 直接返回sum的值 那肯定是 a=2 了。
而当执行到int b =add(2,3,5); 时,传递给add方法的参数先匹配前两个具体的参数,最后一个5匹配可变参数,因为只有一个元素所以形成的args数组就是一个长度为1的数组。而for循环的执行条件是i<args.length即i<1,所以只执行1次循环 sum+=args[0](sum+=args[0]其实跟sum=sum+args[0]等同)即 sum=2+5 sum=7
回复 使用道具 举报
运行int a= add(2,3);时
int sum = 2,没有args参数  结果2
运行int b= add(2,3,5);
int sum =2,args.length=1,args[0]=5结果为7

回复 使用道具 举报
姜伟 发表于 2013-1-7 10:57
谢谢哥们,明白了,是我自己理解的不透彻,非常感谢,要不然可变参数这一重要内容我就掌握不好了! ...

呵呵,共同学习进步!一起加油!
回复 使用道具 举报
舒远 黑马帝 2013-1-7 11:00:23
8#
两次运算中y值都没有加。
可变参数在方法定义的时候只能放在最后一个参数位置,运行时会匹配你前面所有已定义的非可变参数。
所以你的代码两次执行y值都没有被加上
2和3分别匹配了x和y参数。结果只有2
2,3,5分别匹配x,y,args。这里args的长度为1,就是5这个值。所以是2+5 = 7
回复 使用道具 举报
姜伟 发表于 2013-1-7 10:57
谢谢哥们,明白了,是我自己理解的不透彻,非常感谢,要不然可变参数这一重要内容我就掌握不好了! ...

public static int add(int x,int y,int...args)
定义了可变参数,y没有参加运算,且创建的int类型数组和y是相同类型,所以y根本没有必要定义的。原理大家说了,提供下修改方式
可以改为
public class VarableParameter {
          public static void main(String[]args){
                              int a= add(2,3);
                              int b =add(2,3,5);                  
                    }

       public static int add(int x,int...args){//这里去掉参数int y
                   int sum =x;
                   for(int i=0;i<args.length;i++){
                      sum +=args;
                       }
                 return sum;
               }
}
或者
public class VarableParameter {
          public static void main(String[]args){
                              int a= add(2,3);
                              int b =add(2,3,5);                  
                    }

       public static int add(int x,int...args){
                   int sum =x+y;//这里加上y
                   for(int i=0;i<args.length;i++){
                      sum +=args;
                       }
                 return sum;
               }
}
推荐第一种修改方式
回复 使用道具 举报
李培根 发表于 2013-1-7 11:05
public static int add(int x,int y,int...args)
定义了可变参数,y没有参加运算,且创建的int类型数组和 ...

请问怎样把帖子改成已解决?
回复 使用道具 举报
本帖最后由 徐帅 于 2013-1-7 11:44 编辑
姜伟 发表于 2013-1-7 11:37
请问怎样把帖子改成已解决?


选择编辑,在你发帖时选择发帖类型的地方选择为“已解决”就OK了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马