先看两个简单的例子,来感受一下Java的不定长度参数
第一个例子:
- publicclassVariArgs{
- publicstaticvoidmain(String[]args){
- test();
- test("aaa");
- test("aaa","bbb");
- test("aaa","bbb","ccc");
- }
- publicstaticvoidtest(String...args){
- System.out.println(args.getClass());
- for(Stringarg:args){
- System.out.println(arg);
- }
- }
- }
第二个例子:
- publicclassVariArgs{
- publicstaticvoidmain(String[]args){
- test("aaa");
- test("aaa","bbb");
- test("aaa","bbb","ccc");
- }
- publicstaticvoidtest(Stringarg,String...args){
- System.out.println(arg);
- System.out.println("----------------");
- for(Strings:args){
- System.out.println(s);
- }
- }
- }
读者可以自己运行一下,这个不定长度参数的类型为String[],即字符串数组。
从上面可以看出,如果一个方法的参数定为不定参数的话,这个参数可以根据参数个数动态生成一个数组,然后传入方法执行。
不过,不定参数有两个规定:第一,方法的参数列表中最多只有一个不定长度的参数;第二,就是不定长度的数组的位置必须是最后一个参数。不然不能通过编译。
对于第一个规定,是因为如果有多于一个不定长度的参数,当真正调用这个方法的时候,JVM、将不知道前面的不定长度参数有多长, 下一个参数是从哪里开始.
对于第二个参数也是一样,编译器不知道不定长度参数的长度,无法确定从哪里开始下一个参数。
以下是几种不正确使用不定长度参数的例子,请不要这样写程序:
- publicstaticvoidtest(Object...objs,Objectobj);
- publicstaticvoidtest(Objectobj1,Object...objs,Objectobj2);
- publicstaticvoidtest(Object...objs1,Object...objs2);
不定参数的方法可以重载。(大家都知道,重载就是方法名相同,而方法的参数列表不同)
下面给出重载的示例:
- publicclassVariArgs{
- publicstaticvoidmain(String[]args){
- test("aaa");
- test("aaa","bbb");
- test("aaa","bbb","ccc");
- }
- publicstaticvoidtest(Object...args){
- }
- publicstaticvoidtest(Stringarg,String...args){
- }
- }
读者如果细心的话,可以看出文章开头给出的两个例子的区别,就是第二个例子比第一个例子的test方法的参数多出了一个String arg,从感觉上没有太大的区别,这有点像编译原理的*和+的区别。第一个test方法指可以有0或N个String做参数,但第二个test方法指至少 一个String做为参数。
然后结合重载来看,把第一个例子和第二个例子合并成一个类,得到以下代码:
- publicclassVariArgs{
- publicstaticvoidmain(String[]args){
- test();
- test("aaa");
- test("aaa","bbb");
- test("aaa","bbb","ccc");
- }
- publicstaticvoidtest(String...args){
- System.out.println(args.getClass());
- for(Stringarg:args){
- System.out.println(arg);
- }
- }
- publicstaticvoidtest(Stringarg,String...args){
- System.out.println(arg);
- System.out.println("----------------");
- for(Strings:args){
- System.out.println(s);
- }
- }
- }
读者可以编译下这个程序,结果是编译不通过。为什么呢?程序编译到第五行时,不能确定test("aaa")该用第10行的test方法还是第17行的方 法,因为两个方法都可以有相同的参数列表。都能精确匹配上参数列表,编译器在这种情况下只好报出编译不能通过的错误。所以在重载这样的方法时,注意参数列 表,不要使两个方法可以有同样的参数列表。
相关推荐
综上所述,Java可变参数是Java语言中一个强大的特性,它简化了处理不定数量参数的方法定义,同时提供了良好的可读性和便利性。理解其工作原理和使用注意事项,可以帮助我们编写出更高效、更易于维护的代码。
Java中的可变长参数(Varargs)是一种非常实用的语言特性,它允许我们在定义方法时接受一个不定数量的参数。这种特性使得我们无需为每个可能的参数组合定义单独的方法,简化了代码并提高了代码的可读性和灵活性。...
Java 类和对象是编程语言的基础,而可变参数(Variable Argument)是 Java 为了解决方法接收不定数量参数的问题引入的一个特性。这个特性允许我们创建一个方法,它能接受一个可变数量的参数,而不是固定数量。这在...
可变参数是JDK 5.0的另一创新,它允许方法接收不定数量的参数,如Arrays.asList()方法。调用时,编译器会自动创建一个数组来存储这些参数。但是,可变参数必须作为方法参数列表的最后一个参数,并且一个方法只能有一...
Java语言中的数组是一种重要的数据结构,它...此外,可变长度参数列表的引入增加了代码的简洁性和可读性,使得处理不定数量参数的操作更加便利。在学习Java编程的过程中,熟练掌握数组及其相关操作是至关重要的一步。
8. **可变参数长度方法(Variable Arity Methods)**:与变量参数相似,但应用于方法声明,允许方法接受不定数量的参数。 Java 5.0 API文档中文版详细列出了所有这些特性的使用方法,包括各个类的构造函数、方法、...
- **变量长度参数(Varargs)**:允许在方法声明中使用`...`作为参数,简化了不定数量的参数传递。 - **增强的for循环(For-Each Loop)**:简化了遍历集合、数组等的数据结构。 3. **核心类库** - **`java.lang...
- Java允许方法接收不定数量的参数,使用省略号`...`表示。 7. **数组简介** - 数组是一种存储相同类型元素的数据结构。 8. **一维数组的声明与初始化** - 定义数组的语法为:`数据类型[] 数组名 = new 数据...
在 SpringMVC 中,使用 @RequestBody 注解可以将请求体中的数据转换为 Java 对象,但是在使用 map 接收请求参数时,经常会遇到一些问题。本文将讨论如何快速解决 SpringMVC @RequestBody 用map接收请求参数的问题。 ...
- 可变长参数只能作为方法的最后一个参数,且不能与其他固定长度参数混淆。 7. **静态导入** - 静态导入(`import static`)允许直接使用类的静态成员,简化代码,但可能导致命名冲突。 这些知识构成了Java开发的...
- **可变参数的作用和特点**:可变参数允许方法接收不定数量的参数,这些参数会被打包成一个数组传递给方法。使用时只需在参数类型后面加上三个点`...`。 #### 第五章 面向对象 - **类和对象的关系**:类是对一类...
可变参数是一种在方法声明中接受不定数量参数的机制。如Arrays.asList()方法,可以接收任意数量的参数。使用可变参数时,需要注意它们必须是参数列表的最后一个,并且在同一方法中不能有其他可变参数。 枚举类是...
Java Varargs(可变参数)是Java 1.5版本引入的一个特性,允许开发者在编写方法时可以接受任意数量的参数。Varargs是variable arguments的缩写,即变参,有时也简称为variable arguments。可变参数使得方法能够接受...
Java 5之后引入了可变参数的概念,允许方法接受数量不定的参数。例如: ``` public void print(int... numbers) { for (int num : numbers) { System.out.println(num); } } ``` - **命令行参数** Java...
可变参数是JDK 5的另一大创新,它允许方法接受不定数量的参数,如`public void foo(int... args)`。在方法内部,可变参数会被编译器自动封装为数组。可变参数必须是参数列表的最后一个,且一个方法只能有一个可变...
4. **可变参数**:从JDK 1.5开始,Java允许方法接收不定数量的参数。通过在参数类型后面加上三个点(...),可以创建一个可变参数的方法。例如: ```java public void printNumbers(int... nums) { for (int num ...
- **可变参数**:允许方法接收数量不定的参数,参数以数组形式传递,提高了方法的灵活性。 - **枚举**:枚举类型是JDK 5.0新增的,用于表示有限的、固定的对象集合,增强了类型安全,并提供了更好的编译时检查。 ...
8. **数组声明**:在Java中,正确声明数组的方式是B和E选项,其中B表示一个不定长度的一维数组,E表示一个二维的Object数组。 9. **包和import语句**:在同一个类中,`package`语句只能出现一次,且必须位于文件...
然而,随着Java的版本更新,例如Java SE(标准版),性能得到了显著提升,包括引入泛型、类型安全的枚举、不定长参数和自动装/拆箱等特性,增强了语言的灵活性和效率。 Java课程设计的目的是让学生深入理解Java编程...