美文网首页Java
[Java]重学Java-可变参数

[Java]重学Java-可变参数

作者: AbstractCulture | 来源:发表于2021-06-09 12:49 被阅读0次

    可以变动的参数数量

    编程离不开写方法(函数),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);
    }
    

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

    相关文章

      网友评论

        本文标题:[Java]重学Java-可变参数

        本文链接:https://www.haomeiwen.com/subject/dbleeltx.html