引言
因为Java要求实参(Arguments)和形参(Parameters)的个数和类型都必须逐一匹配,而形参在定义方法时就已经固定下来了,那么应该如何在Java程序里定义实参个数可变的方法呢?目前有以下三种解决方式:
- 方法重载;
- 数组参数Object[] args;
- 动态参数/可变参数Object… args;
说明:以上方法实现了实参个数可变,Object实现了参数类型可变。
一、方法重载
简介:重载允许在同一个类拥有许多只有形参列表不同的方法。然后,由编译器根据调用时的实参来选择到底要执行哪一个方法。
缺点:尽管可以通过重载机制,为同一个方法提供带有不同数量的形参的版本,但这仍不能达到让实参数量任意变化的目的。
举例:可以通过重载testOverloading方法,实现传入多种参数的可能。
public class OverloadingSampleA {
public static void main(String[] args) {
testOverloading(1);// 打印出A
testOverloading(1, 2);// 打印出B
}
private static void testOverloading(int i) {
System.out.println("A");
}
private static void testOverloading(int i, int j) {
System.out.println("B");
}
}
二、Object[] args
缺点:虽然只需一个方法,但在调用方法时,需要构造数组参数(先声明一个数组,再将参数一个个加到数组中),用起来太麻烦。
举例:最常见的是main方法,利用一个数组来包裹要传递的实参。
public static void main(String[] args) {
}
三、Object… args
J2SE 1.5中提供了Varargs机制(variable number of arguments),允许直接定义能和多个实参相匹配的形参。
3.1 定义
定义:类型… 参数名。
原理:编译器会把这个形参转化为一个数组形参,并在编译出的class文件里作上一个记号,表明这是个实参个数可变的方法。
注意:
- 由于存在这样的转化,所以不能再为这个类定义一个和转化后的方法签名一致的方法。
- 可变长参数必须是最后一个参数。
- 可变参数同时可以跟固定的参数混合使用,但是一个方法的参数中不能同时拥有2种类型的可变参数。
举例:以下两个方法“等效”,且不能在一个类下同时定义。
private static int sumUp(int.