解释一下 Java 中的 Varargs?
得益于 Java 的可变参数 (varargs) 功能,方法可以接受可变数量的参数。这对于需要能够管理未知或可变数量输入的方法非常有用。
在 Java 5 中引入 varargs 之前,我们有两种方法来处理需要采用可变数量参数的方法。一种方法是使用重载方法。该方法必须经过多次迭代开发,每次迭代都有不同数量的参数。
如果该过程有许多参数,则可能会变得复杂且难以维护。
Varargs 的语法
在内部,使用一维数组来实现 varargs 方法。这表明 varargs 方法的参数保存在一个数组中,并且可以使用每个参数的索引来访问它。可以使用三个句点 (...) 指定 varargs 参数。
public static void happy(int ... a) { // 方法主体 }
使用这种方法,编译器会获知 fun() 可能使用 0-n 个或更多参数进行调用。因此,在这种情况下隐式指定为 int[] 类型的数组。
示例 1
display()
此代码定义了一个名为 VarargsInstance 的类,该类具有一个名为 display 的方法,该方法可以采用可变数量的字符串参数。在主函数中,display 方法被调用两次 - 一次没有任何参数,一次带有四个字符串参数。调用时,该方法会打印消息。
算法
步骤 1:创建一个名为 VarargsInstance 的类。
步骤 2:定义一个名为 display() 的静态方法。此方法采用可变数量的 String 参数。
步骤 3:在 display() 方法内部,将以下消息打印到控制台:"已调用 display 方法"。
步骤 4:创建 main 方法。
步骤 5:在 main 方法中,使用零个参数调用 display() 方法一次。
步骤 6:使用四个参数再次调用 display() 方法。
步骤 7:运行程序。
示例
public class VarargsInstance{ public static void display(String... values){ System.out.println("The display method has been called "); } public static void main(String args[]){ display();//零参数 display("my","name","is","tutorialspoint");//四个参数 } }
输出
The display method has been called The display method has been called
示例 2
happy()
此代码定义了一个名为 Example1 的类,其中的方法 happy() 可以接受灵活数量的整数参数。在此方法中,它显示参数的数量并使用循环列出参数。在主要部分中,它演示了使用不同数量的参数调用 happy() 方法,生成的输出显示了所提供参数的数量和值。
算法
步骤 1:创建一个名为 Example1 的类。
步骤 2:定义一个名为 happy() 的静态方法。此方法采用可变数量的 int 参数。
步骤 3:在 happy() 方法中,执行以下操作:
将其打印到控制台:"参数数量:"+ a.length。
通过 for each 循环迭代 a 变量,将数组的内容打印到控制台。
步骤 4:创建 main 方法。
步骤 5:在 main 方法中,执行以下操作:
使用一个参数 250 调用 happy() 方法一次。
使用四个参数 20、30、40 和 50 再次调用 happy() 方法。
使用零再次调用 happy() 方法论据。
第 6 步:运行程序。
示例
public class Example1 { static void happy(int... a) { System.out.println("Count of parameters: " + a.length); // 使用 for each 循环显示 a 的内容 for (int i : a) System.out.print(i + " "); System.out.println(); } public static void main(String args[]) { // 调用带有不同数量参数的 varargs 方法 happy(250); // 四个参数 happy(20, 30, 40, 50); // 无参数 happy(); } }
输出
参数数量:1 250 参数数量:4 20 30 40 50 参数数量:0
示例 3
display()
在此代码中,有一个名为 VarargsInstance2 的类,其方法 display() 可以接受可变数量的字符串参数。调用该方法时,它会打印"display 方法已调用",然后在单独的行上列出每个提供的参数。在主要部分中,通过使用不同数量的参数调用 display() 方法演示了该方法,生成如图所示的显示输出。
算法
步骤 1:创建一个名为 VarargsInstance2 的类。
步骤 2:定义一个名为 display() 的静态方法。此方法采用可变数量的 String 参数。
步骤 3:在 display() 方法中,执行以下操作:
将以下消息打印到控制台:"display method called"。
使用 for each 循环迭代 values 变量并将数组的内容打印到控制台。
步骤 4:创建 main 方法。
步骤 5:在 main 方法中,执行以下操作:
使用零个参数调用 display() 方法一次。
使用一个参数"hey"再次调用 display() 方法。
使用四个参数"welcome"、"all"、"to"和"Tutorialspoint"。
第 6 步:运行程序
示例
public class VarargsInstance2{ static void display(String... values){ System.out.println("display method called "); for(String s:values){ System.out.println(s); } } public static void main(String args[]){ display();//零个参数 display("hey");//一个参数 display("welcome","all","to","Tutorialspoint");//四个参数 } }
输出
display method called display method called hey display method called welcome all to Tutorialspoint
示例 4
for()
此代码使用接受字符串和灵活数量的整数参数的方法 joy() 定义一个名为 Tutorialspoint 的类。调用该方法时,它会显示给定的字符串、提供的参数数量,然后使用循环列出整数参数。在主要部分中,通过使用字符串和整数的不同组合调用 joy() 方法演示了该方法,并生成如图所示的显示输出。
算法
步骤 1:定义一个名为 joy() 的静态方法。此方法接受一个 String 参数和一个可变数量的 int 参数。
步骤 2:在 joy() 方法中,执行以下操作:
将 thia 打印到控制台:"String: " + str。
将 thia 打印到控制台:"count of parameters is: " + b.length。
使用 for each 循环迭代 b 变量并将数组的内容打印到控制台。
步骤 3:创建 main 方法。
步骤 4:在 main 方法中,执行以下操作:
使用字符串"TLP"和两个整数 250 和 250 调用 joy() 方法一次350.
使用字符串"Example"和五个整数 20、30、40、50 和 60 再次调用 joy() 方法。
使用字符串"for students"且无整数再次调用 joy() 方法。
步骤 5:运行程序。
示例
public class Tutorialspoint{ static void joy(String str, int... b) { System.out.println("String: " + str); System.out.println("count of arguments is: " + b.length); // 使用 for each 循环显示 for (int i : b) System.out.print(i + " "); System.out.println(); } public static void main(String args[]) { // 使用不同的参数调用 joy() joy("TLP", 250, 350); joy("Example", 20, 30, 40, 50, 60); joy("for students"); } }
输出
String: TLP count of arguments is: 2 250 350 String: Example count of arguments is: 5 20 30 40 50 60 String: for students count of arguments is: 0
结论
Vararg 方法可以有意多样化,尽管这种多样化可能会带来不确定性。在 JDK 5 之前的时代,存在两种管理可变长度参数的方法:重载或使用数组参数。重要的是要注意,在方法中,只允许使用单个变量参数。此外,变量参数 (Varargs) 必须保留其作为最终参数的地位。