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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张榆 中级黑马   /  2012-9-11 23:34  /  1788 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张榆 于 2012-9-16 22:51 编辑

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

评分

参与人数 1技术分 +1 收起 理由
创出一片辉煌 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
本帖最后由 舒远 于 2012-9-12 00:02 编辑

这个确实java语言级别的东西,就是语法规定。
因为参数个数不定,所以当其后边还有相同类型参数时,java无法区分传入的参数属于前一个可变参数还是后边的参数,所以只能让可变参数位于最后一项。
回复 使用道具 举报
这是java语言的规则,没有什么可考虑的.
就好比是先有鸡还是先有蛋的问题
回复 使用道具 举报
在J2SE 5.0中,一个新的语法被引入,就是在参数类型名称后面加上 ... ,表示该方法可以接受多个该类型的参数。需要说明的是可变长度参数必须放在参数列表的最后,且一个方法只能包含一个这样的参数。这个顺序的原因区分后续参数应该属于前面的不可变参数(如果有的话,且同一种类型)还是后面的可变参数。
回复 使用道具 举报
如果可变参数后面还有参数的话,那编译器怎么知道哪些是可变参数的部分呢?举个比较极端的例子,一个方法接受三个参数,第一个和第三个都是可变参数,然后你在调用这个方法的时候传入了8个参数吧,那编译器该怎样判断呢?为了避免有歧义,所以规定可变参数只能是最后一个参数了。
回复 使用道具 举报
代码说明问题!
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中,处理的父异常应放在最后处理是一个道理。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马