(四)《Java编程思想》——可变参数列表

以object数组为参数的方法实现可变参数列表

package chapter5;

/**
 * 以object数组为参数的方法实现可变参数列表
 */
class A {
}

public class VarArgs {
    static void printArray(Object[] args) {
        for (Object obj : args)
            System.out.print(obj + "   ");
        System.out.println();
    }

    public static void main(String[] args) {
        printArray(new Object[] { new Integer(55), new Float(5.34),
                new Double(3.56) });
        printArray(new Object[] { "one", "two", "three" });
        printArray(new Object[] { new A(), new A(), new A() });
    }
}

【运行结果】:

55   5.34   3.56  
one   two   three  
chapter5.A@18a992f   chapter5.A@4f1d0d   chapter5.A@1fc4bec  

java SE5之后,有了新特性可以实现可变参数列表

package chapter5;

/**
 * 可变参数列表
 */
public class NewVarArgs {
    static void printArray(Object... args) {
        for (Object obj : args)
            System.out.print(obj + "  ");
        System.out.println();
    }

    public static void main(String[] args) {
        printArray(new Integer(33), new Float(5.23), new Double(3.55));
        printArray(33,5.23f,3.55d);
        printArray("one","two","three");
        printArray(new A(),new A(),new A());
        printArray((Object[])new Integer[]{1,2,3,4,5,6});
        printArray();
    }

}

【运行结果】:

33  5.23  3.55 
33  5.23  3.55 
one  two  three 
chapter5.A@18a992f  chapter5.A@4f1d0d  chapter5.A@1fc4bec 
1  2  3  4  5  6 

  上面的例子中,printArray();是正确的,表明可以将0个参数传递给可变参数列表。当具有可选的尾随参数是,很有用。

package chapter5;

/**
 * 有可选尾随可变参数列表
 */
public class OptionalTrailingArguments {
    static void f(int required, String... trailing) {
        System.out.print("required:" + required + " ");
        for (String s : trailing)
            System.out.print(s + " ");
        System.out.println();
    }

    public static void main(String[] args) {
        f(1, "one");
        f(2, "one", "two");
        f(0);
    }
}

【运行结果】:

required:1 one
required:2 one two
required:0

可变参数列表与自动包装机制和谐共处

package chapter5;

/**
 * 可变参数列表与自动包装机制和谐共处
 */
public class AutoboxingVarargs {
    static void f(Integer... args) {
        for (Integer i : args)
            System.out.print(i + "  ");
        System.out.println();
    }

    public static void main(String[] args) {
        f(new Integer(1), new Integer(2));
        f(4, 5, 6, 7);
        f(23, new Integer(24), 25);
    }
}

【运行结果】:

 1  2 
4  5  6  7 
23  24  25 

 可变参数列表使重载变复杂

package chapter5;

/**
 * 可变参数列表使重载变复杂
 */
public class OverloadVargs {
    
    static void f(Character... args) {
        System.out.print("first");
        for (Character c : args)
            System.out.print(" " + c);
        System.out.println();
    }
    
    static void f(Integer... args) {
        System.out.print("second");
        for (Integer i : args)
            System.out.print(" " + i);
        System.out.println();
    }
    
    static void f(Long... args) {
        System.out.print("Third");
    }
    
    public static void main(String[] args) {
        f('a','b','c');
        f(1);
        f(2,1);
        f(0);
        f(0L);
        //f();
    }

}

【运行结果】:

 first a b c
second 1
second 2 1
second 0
Third

上例会自动匹配重载的方法,但是调用f()时,就不知道匹配哪个方法了,此时须增加一个可变参数来解决问题。

原文地址:https://www.cnblogs.com/echolxl/p/3175110.html