黑马程序员技术交流社区

标题: 可变参数的问题 [打印本页]

作者: 张榆    时间: 2012-9-11 23:34
标题: 可变参数的问题
本帖最后由 张榆 于 2012-9-16 22:51 编辑

为什么
可变长度参数必须放在参数列表的最后?想了很久都没想到为什么,难道是规定?


作者: 舒远    时间: 2012-9-11 23:54
本帖最后由 舒远 于 2012-9-12 00:02 编辑

这个确实java语言级别的东西,就是语法规定。
因为参数个数不定,所以当其后边还有相同类型参数时,java无法区分传入的参数属于前一个可变参数还是后边的参数,所以只能让可变参数位于最后一项。
作者: 王金科    时间: 2012-9-12 01:39
这是java语言的规则,没有什么可考虑的.
就好比是先有鸡还是先有蛋的问题
作者: 张飞年    时间: 2012-9-12 03:05
在J2SE 5.0中,一个新的语法被引入,就是在参数类型名称后面加上 ... ,表示该方法可以接受多个该类型的参数。需要说明的是可变长度参数必须放在参数列表的最后,且一个方法只能包含一个这样的参数。这个顺序的原因区分后续参数应该属于前面的不可变参数(如果有的话,且同一种类型)还是后面的可变参数。
作者: 黑马_许芸    时间: 2012-9-12 08:51
如果可变参数后面还有参数的话,那编译器怎么知道哪些是可变参数的部分呢?举个比较极端的例子,一个方法接受三个参数,第一个和第三个都是可变参数,然后你在调用这个方法的时候传入了8个参数吧,那编译器该怎样判断呢?为了避免有歧义,所以规定可变参数只能是最后一个参数了。
作者: 焦晨光    时间: 2012-9-12 09:59
代码说明问题!
class Demo
{
public void methed(int... x,int y)//传入(1,2,3,4)将都被int... x接收,
                                                // int y没有值传入,编译失败
{
  for(i=0;i<x.length;i++)
  {
   System.out.println(x);
  }
  System.out.println(y);
}

public void methed2(int y,int... x)//传入(1,2,3,4)1赋给y,其他全部赋给int... x
                                                  //编译可通过
{
  for(i=0;i<x.length;i++)
  {
   System.out.println(x);
  }
  System.out.println(y);
}
}
class DemoTest
{
public static void main(String[] args)
{
  Demo d = new Demo()
  d.methed1(1,2,3,4);//调用methed1方法传入参数
  d.methed1(1,2,3,4);//调用methed2方法传入参数
}
}
故,在java中,如果方法定义的参数列表中有可变参数,必须放在参数列表的最后
由此可以联想到在异常处理语句catch中,处理的父异常应放在最后处理是一个道理。





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