[Java]重学Java-可变参数
2021-06-09 本文已影响0人
AbstractCulture
可以变动的参数数量
编程离不开写方法(函数),Java中的大多数方法都是固定数量的参数,JDK5提供了可变参数
来让方法调用更加灵活.
对象数组作为参数传递
/**
* 打印对象数组的内容
* @param args 数组
*/
static void printArray(Object[] args) {
for (Object obj : args) {
System.out.print(obj + " ");
}
System.out.println();
}
- printArrayTest
private static void printArrayTest() {
printArray(new Object[]{47, (float) 3.14, 11.11});
printArray(new Object[]{"one", "two", "three"});
// 打印对象的引用地址
printArray(new Object[]{new A(), new A(), new A()});
}
输出结果:
47 3.14 11.11
one two three
com.tea.modules.java8.extend.A@5910e440 com.tea.modules.java8.extend.A@6267c3bb com.tea.modules.java8.extend.A@533ddba
使用可变参数来代替对象数组
/**
* 打印可变参数列表
* @param args 指定参数时,编译器实际上会为你填充数组
*/
static void printObjectArgs(Object... args) {
for (Object obj: args) {
System.out.print(obj + " ");
}
System.out.println();
}
- printObjectArgsTest
private static void printObjectArgsTest(){
// Can take individual elements:
printObjectArgs(47, (float) 3.14, 11.11);
printObjectArgs(47, 3.14F, 11.11);
printObjectArgs("one", "two", "three");
printObjectArgs(new A(), new A(), new A());
// Or an array:
printObjectArgs((Object[]) new Integer[] {1, 2, 3, 4});
// Empty list is OK
printObjectArgs();
}
输出结果:
47 3.14 11.11
47 3.14 11.11
one two three
com.tea.modules.java8.extend.A@5910e440 com.tea.modules.java8.extend.A@6267c3bb com.tea.modules.java8.extend.A@533ddba
1 2 3 4
可变参数不依赖自动装箱
/**
* 装箱类型作为可变参数,传入的参数会自动装箱
* @param args
*/
static void printfCharArgs(Character... args) {
System.out.print(args.getClass());
System.out.println(" length " + args.length);
}
/**
* 基础类型作为可变参数
* @param args
*/
static void printBaseTypeArgs(int... args) {
System.out.print(args.getClass());
System.out.println(" length " + args.length);
}
/**
* 可变参数类型: <br>
* 测试是否可以打印基础类型的class信息
*/
private static void varargType () {
printfCharArgs('a');
printfCharArgs();
printBaseTypeArgs(1);
printBaseTypeArgs();
System.out.println("int[]: "+ new int[0].getClass());
int[] array = new int[]{1,2,3};
System.out.println(array.length);
for (int i = 0; i < array.length; i++) {
System.out.println(i);
}
}
输出结果:
class [Ljava.lang.Character; length 1
class [Ljava.lang.Character; length 0
class [I length 1
class [I length 0
int[]: class [I
当使用泛型的可变参数时,不可以使用基本类型
/**
* 泛型的类型参数只能是类类型,不能是简单类型
*
* @param <T>
* @param values
*/
private static <T> void printGenericObjects(T... values) {
for (T value : values) {
System.out.println(value + " " + value.getClass());
}
}
public static void main(String[] args) {
Integer[] array = new Integer[]{1, 2, 3};
int[] arrayB = new int[]{1, 2, 3};
printGenericObjects(array);
printGenericObjects(arrayB);
}
基础数据类型组成的数组,会被当成一个对象处理.
使用对象组成的数组,才会档次一个对象数组去遍历.