Java可变长参数

版权声明:最终解释权归属Hern所有,恒! https://blog.csdn.net/qq_36761831/article/details/85268612

含义

Java 5中提供了可变长参数,允许在调用方法时传入不定长度的参数。变长参数本质上还是基于数组的实现

void foo(String... args);
void foo(String[] args);
void foo(int... arrys);
void foo(float... arrys);
……

一般在不确定方法需要处理的对象的数量时可以使用可变长参数,会使得方法调用更简单,无需手动创建数组 new T[]{…} 。

定义方法

在定义方法时,在最后一个形参后加上三点 …,就表示该形参可以接受多个参数值,多个参数值被当成数组传入。上述定义有几个要点需要注意:

  • 可变参数只能作为函数的最后一个参数,但其前面可以有也可以没有任何其他参数

  • 运行时要注意优先级问题:系统一般先匹配确定参数的方法,没有再去匹配调用不定项参数的方法

  • 由于可变参数必须是最后一个参数,所以一个函数最多只能有一个可变参数!!!

  • Java的可变参数,会被编译器转型为一个数组

  • 变长参数在编译为字节码后,在方法签名中就是以数组形态出现的。这两个方法的签名是一致的,不能作为方法的重载。如果同时出现,是不能编译通过的。可变参数可以兼容数组,反之则不成立

  • 使用 Object… 作为变长参数:int[] 无法转型为 Object[], 因而被当作一个单纯的数组对象 ; Integer[] 可以转型为 Object[], 可以作为一个对象数组:

public void foo(Object... args) {
    System.out.println(args.length);
}

foo(new String[]{"arg1", "arg2", "arg3"}); //结果是:3
foo(100, new String[]{"arg1", "arg1"}); //结果是:2

foo(new Integer[]{1, 2, 3}); //结果是:3
foo(100, new Integer[]{1, 2, 3}); //结果是:2
foo(1, 2, 3); //结果是:3
foo(new int[]{1, 2, 3}); //结果是:1

代码示例: 

package com.test;

import java.util.Arrays;

public class Test1 {
	
	public static int count(int... arry) {
		int result = 0;
		for(int temp : arry) {
			result += temp;
		}
		
		return result;
	}
	
	
	public static int sum(int[] arry) {
		int result = 0;
		for(int temp : arry) {
			result += temp;
		}
		
		return result;
	}
	
	public void getStr(String... str) {
		for(String temp : str) {
			System.out.println(temp);
		}
	}
	
	public static int getNum(Object... arry) {
		return arry.length;
	}
	
	public static void main(String[] args) {
		
		int num1 = new Test1().count(new int[]{1,2,3,4,5,6,7});
		
		int num2 = new Test1().sum(new int[] {1,2,3,4,5,6,7});
		
		int num3 = new Test1().getNum(123456,new int[] {1,2,3,4,5,6,7});
		
		new Test1().getStr(new String[] {"这是第一行字符串","这是第二行字符串","这是第三行字符串","这是第四行字符串"});
		
		System.out.println(num1);//输出结果是:28
		System.out.println(num2);//输出结果是:28
		System.out.println(num3);//输出结果是:2
		
	}

}

猜你喜欢

转载自blog.csdn.net/qq_36761831/article/details/85268612