可变参数

/*
 * 可变参数:定义方法的时候不知道该定义多少个参数
 * 格式:
 *         修饰符 返回值类型 方法名(数据类型…  变量名){
 * 
 *         }
 * 
 *         注意:
 *             这里的变量其实是一个数组
 *             如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个
 */                
public class ArgsDemo {
    public static void main(String[] args) {
        // 2个数据求和
        int a = 10;
        int b = 20;
        int result = sum(a, b);
        System.out.println("result:" + result);

        // 3个数据的求和
        int c = 30;
        result = sum(a, b, c);
        System.out.println("result:" + result);

        // 4个数据的求和
        int d = 30;
        result = sum(a, b, c, d);
        System.out.println("result:" + result);

        // 需求:我要写一个求和的功能,到底是几个数据求和呢,我不太清楚,但是我知道在调用的时候我肯定就知道了
        // 为了解决这个问题,Java就提供了一个东西:可变参数
        result = sum(a, b, c, d, 40);
        System.out.println("result:" + result);

        result = sum(a, b, c, d, 40, 50);
        System.out.println("result:" + result);
    }

    public static int sum(int... a) {
    
        int s = 0;
        
        for(int x : a){
            s +=x;
        }
        
        return s;
    }

}

可变参数底层其实是一个数组,下面是通过反编译工具参看的字节码内容:

import java.io.PrintStream;

public class ArgsDemo
{

    public ArgsDemo()
    {
    }

    public static void main(String args[])
    {
        int a = 10;
        int b = 20;
        int result = sum(new int[] {
            a, b
        });
        System.out.println((new StringBuilder("result:")).append(result).toString());
        int c = 30;
        result = sum(new int[] {
            a, b, c
        });
        System.out.println((new StringBuilder("result:")).append(result).toString());
        int d = 30;
        result = sum(new int[] {
            a, b, c, d
        });
        System.out.println((new StringBuilder("result:")).append(result).toString());
        result = sum(new int[] {
            a, b, c, d, 40
        });
        System.out.println((new StringBuilder("result:")).append(result).toString());
        result = sum(new int[] {
            a, b, c, d, 40, 50
        });
        System.out.println((new StringBuilder("result:")).append(result).toString());
    }
//可以看出在这里已经优化为一个数组了
    public static transient int sum(int a[])
    {
        int s = 0;
        int ai[];
        int j = (ai = a).length;
        for (int i = 0; i < j; i++)
        {
            int x = ai[i];
            s += x;
        }

        return s;
    }
}
原文地址:https://www.cnblogs.com/itboys/p/6146348.html