黑马程序员技术交流社区

标题: 关于可变参数的疑问<已解决> [打印本页]

作者: 武剑峰    时间: 2012-6-12 11:59
标题: 关于可变参数的疑问<已解决>
本帖最后由 武剑峰 于 2012-6-13 08:19 编辑

我定义了两个构造方法,一个是int,一个是int... args,然后创建对象传入int和int,int,发现结果如下
public class changeParameter {
/**
  * @param args
  */
public changeParameter(){}
public changeParameter(int a){
  System.out.println("调用了int 单个方法");
}
public changeParameter(int... args){
  System.out.println("调用了args方法");
}
public static void main(String[] args) {
  // TODO Auto-generated method stub
  new changeParameter(5);
  new changeParameter(5,65);
  
}
}
结果:
          调用了int 单个方法
          调用了args方法
是不是说在调用方法时优先选择精确的调用方法,只有在没有定义精确参数方法时才选择可变参数方法?

作者: 唐志兵    时间: 2012-6-12 12:04
是的,java本身有函数重载功能。

public changeParameter(int a){
  System.out.println("调用了int 单个方法");
}
public changeParameter(int... args){
  System.out.println("调用了args方法");
}
这里你定义了两个相同的函数,所以程序在运行的时候首先会调用最为匹配的函数。

作者: 王广丛    时间: 2012-6-12 12:10
原则上是这样的,因为你的这个方法public changeParameter(int a)参数是固定的,而public changeParameter(int... args)参数是可变的,调用的时候首先
要寻找参数精确的固定的方法中是否含有需要的函数,然后再去寻找可变参数的方法
作者: 庄星睿    时间: 2012-6-12 12:20
当然了如果把你的程序改成这样

public class changeParameter
{
public changeParameter(int a){
  System.out.println("调用了int 单个方法");
}
public changeParameter(int... args){
  System.out.println("调用了args方法");
}
public static void main(String[] args) {
    new changeParameter(5);
  new changeParameter(5,65);
new changeParameter();    //他调用的还是public changeParameter(int... args)方法

  
}
}

你定义的那个(int...args)实际上是(int[] args)的一种简写格式,但如果要定义成(int[] args),你就得传一个数组了,new changeParameter(new int[]{1,2,34};而且数组形式的形参可以处于形参列表的任意位置,但个数可变的形参只能处于参数列表的最后了(int a,String...args),也就是说,一个方法里面最多只能定义一个长度可变的形参

作者: 郑传庆    时间: 2012-6-12 12:21
第一个方法定义参数是一个整型类型:public changeParameter(int a )   表示确定性,规定只能传一个int类型的参数。
第二个方法定义的参数虽说也是整型类型:public changeParameter(int... args),但是在参数里面(int... args)定义的参数就属于泛型类型的整型参数,表示不确定性,也就是说该方法可以传一个int参数,也可以传多个int参数。
作者: 陈剑华    时间: 2012-6-12 12:37
记住,在选择重载方法的时候 “加宽先于装箱执行” --〉“装箱先于var-arg执行”





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