Java

[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();
}
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();
}
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);
}

基础数据类型组成的数组,会被当成一个对象处理.
使用对象组成的数组,才会档次一个对象数组去遍历.

上一篇下一篇

猜你喜欢

热点阅读