0%

Java可变参数

Java可变参数

在java方法定义是可以使用个数不确定的参数,对于同一个方法可以用不同个数的参数调用。

1. 定义方法

…表示可变参数
在有可变参数的方法中可以把参数当做数组使用。

1
2
3
4
5
6
7
//循环输出所有参数值
print(String... args){
for(String temp:args){
System.out.println(temp);
}
}
//补充:这里temp为String,args为对象

实际上,变长参数会被转型为一个数组传入方法体。
1
2
3
4
5
public void foo(String...varargs){}
foo("arg1", "arg2", "arg3");

//上述过程和下面的调用是等价的
foo(new String[]{"arg1", "arg2", "arg3"});

2. 调用

可变长参数方法调用

  • 既可以不带参数,也可以带多个参数。
  • 在调用带有可变参数的方法时,JVM优先调用固定参数的方法
  • 若要调用的方法可以和两个可变参数匹配,则编译出现错误,因为JVM不知道该调用哪一个方法

    3. 一个方法只能带一个可变参数,且必须作为其参数表的最后一个参数


注:

  • 避免带有可变长参数的方法重载,编译器虽然知道怎么调用,但人容易陷入调用的陷阱及误区
  • 别让null值和空值威胁到变长方法。为了说明null值的调用,重新给出一个例子:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class VarArgsTest {
    public void print(String test, Integer... is) {}
    public void print(String test,String...args ) {}

    public static void main(String[] args) {
    VarArgsTest1 test = new VarArgsTest();
    test.print("hello"); //编译不通过
    test.print("hello", null); //编译不通过
    }
    }
    两个方法都匹配,所以编译不通过。同时还有个非常不好的编码习惯,即调用者隐藏了实参类型,这是非常危险的,不仅仅调用者需要“猜测”该调用哪个方法,而且被调用者也可能产生内部逻辑混乱的情况。故应在调用前加:
    1
    String[] strs = null;
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class VarArgsTest {
    public static void main(String[] args) {
    Base base = new Son();
    base.print("hello");
    Son son = new Son();
    son.print("hello"); //编译不通过
    }
    }
    class Base {
    void print(String... args) {
    System.out.println("Base");
    }
    }
    class Son extends Base {
    @Override
    void print(String[] args) {
    System.out.println("Son");
    }
    }
    这里边要注意的主要是方法覆写的要点
  1. 重写方法不能降低访问权限;
  2. 参数列表必须与被重写方法相同(包括显示形式);
  3. 返回类型必须与被重写方法的相同或是其子类;
  4. 重写方法不能抛出新的异常,或者超过了父类范围的异常,只可以抛出更少、更有限的异常,或者不抛出异常。

一个需要注意的问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class VarArgsTest {
public static void m1(String s, String... ss) {
for (int i = 0; i < ss.length; i++) {
System.out.println(ss[i]);
}
}
public static void main(String[] args) {
m1("");
m1("aaa");
m1("aaa", "bbb");
}
}
//编译结果:
//bbb

参考文章:Java中可变长参数的使用及注意事项


完结 撒花 ฅ>ω<*ฅ