`
dengminhui
  • 浏览: 168048 次
  • 来自: ...
社区版块
存档分类
最新评论

Java可变参数学习

阅读更多
 
main方法的签名其实可以这样写:
public static void main(String... args)//方法1
它也可以运行.

并且,如果同时还存在
public static void main(String[] args)//方法2
会报已经存在重复的方法的错误.
由此可见,String... args跟String[] args对于虚拟机来说其实是一回事.
而且,在方法内,通过...传进来的参数的使用方法也跟一个数组完全无二,可以for循环,甚至可以直接转换:
public static void main(String... args)
{
    String[] ss=args;
}

但对于程序员来说却还是有差别的.
1.调用
我们只能这样调用方法2:
main(new String[]{});
即,方法2只能接受String数组做参数.
而我们陌生的方法1可强了,用以下参数调用,照单全收:
main();
main(null);
main(null,null);
main(null,null,null);
......
main("a");
main("a","b");
main("a","b","c");
......
main(new String[]{});

(String...匹配String*,而null也可以是一个特殊的String)

2.参数位置
使用...的参数只能是最后一个参数.不然谁知道你调用的时候,点点点匹配到哪个实参?
public static void main(String[] args,int index)//可以
public static void main(String... args,int index)//不行!

3.重载
假设有以下两个方法:
public static void main(String... args)//方法1
public static void main(String a,String... args)//方法3
从语法上来看,这个重载完全没有错误,eclipse也没有报错.但是当调用时使用的参数个数大于这些方法中点点点参数前面的参数个数时,eclipse就会发现这个错误了.很拗口是不是?嘿嘿~还是举例来说吧.以上这两个方法,如果调用时
main();
编译器会认出这个调用的是方法1.但是如果调用时
main("");
编译器就疯了...因为一个String参数,既符合方法1的点点点,也符合方法3的String+点点点,编译器就不知道调用的是哪个方法了.
String[]参数不会有这种问题.
所以重载时要注意,如果点点点参数前面有跟它类型相同的参数...最好的方法,似乎就是换回数组形式了,要么就给方法改个名字吧.

4.遇上泛型加外包
用个实例来说
java.util.Arrays是个工具类,所有方法都是静态的,对数组的操作.里面有个方法asList(T... args),用来把类型T的数组转化成List<T>.
这是个很有用的方法,在绝大多数情况下都能如你所愿.
但是,你可以试试下面的写法
int[] is=...//自定义的数组,或者从什么地方获取来的数组
List<Integer> list=Arrays.asList(is);
很不幸,不要说执行,编译都通不过.错误的意思大概是:
不能将List<int[]>转化成List<Integer>
明白了吧?
你的设想是,把int[]中的每一个元素对应T...中的每一个点,
可编译器不这么想.因为int是原始类型,不是Object的子类.而泛型T隐含的条件是T extends Object.所以编译器不会把每一个int看做T,不会把int[]看做T点点点.虽然java已经支持自动将原始类型封包成外包类,但那是单个的情况.
而数组(不管什么类型)则是一种特殊的类型,是Object的子类,所以编译器觉得整个int[]对应一个T,你调用的方法是asList<int[]>(int[]... args)而不是你想象中的asList<Integer>(Integer...)

资料引用:http://hi.baidu.com/%C4%A9%C8%D5%CB%AB%D7%D3/blog/item/22409bcc12ec5c1701e928be.html
分享到:
评论
1 楼 dearhwj 2009-05-10  
对于Java1.5新功能-Variable Arguments可变参数我也整理一份资料http://hi.baidu.com/dearhwj/blog/item/4792721c8e13268387d6b606.html

相关推荐

    java可变长参数(三个点)md,学习代码

    因为可变长参数不能紧跟在非可变参数之后。 在实际编程中,可变长参数常常用于简化函数调用,例如`Arrays.asList()`和`String.format()`等。在Java Web开发中,比如使用Servlet处理HTTP请求时,有时也需要使用可变...

    大数据必学Java基础(二十七):详述main方法和了解可变参数

    Java中的main方法是每个Java...总之,理解Java的main方法和可变参数对于学习Java编程,特别是处理大数据应用来说是非常基础且重要的。熟悉这些概念可以帮助你更好地构建和运行Java程序,以及处理复杂的数据处理任务。

    Java编程学习之java的不可变数据结构.doc

    Java编程学习之java的不可变数据结构 在Java编程中,数据结构的不可变性是一个非常重要的概念。许多开发人员认为,只要使用final关键字或val关键字就可以使对象不可变,但是这是一种误解。不可变数据结构具有许多...

    Java参数分析

    - 自Java 5起,引入了可变参数,允许一个方法接受任意数量的同一类型的参数。这在实现灵活的函数接口时非常有用,例如`public void printNumbers(int... numbers)`,这个方法可以接受零个、一个或多个整数。 6. **...

    Java JDK 5.0学习笔记

    Java 5.0引入了可变参数,使得方法可以接受任意数量的同类型参数。例如: ```java public void printNumbers(int... numbers) { for (int num : numbers) { System.out.println(num); } } ``` 九、静态导入...

    20_集合_第3天(Map、可变参数、Collections)_讲义

    可变参数是Java 5引入的一个特性,它允许函数接收不定数量的参数。可变参数在声明时以省略号(….)表示,如`public void myMethod(int... numbers)`。在函数内部,可变参数会被处理为一个数组,可以方便地进行迭代或...

    良葛格Java JDK 5.0学习笔记ch05

    Java 5.0引入了可变参数,允许方法接受不定数量的参数。定义可变参数的方法使用`...`运算符,如`public void printNumbers(int... numbers)`。这使得在调用方法时,可以传入任意数量的整数,内部会将它们封装成一个...

    Java个人学习小结

    - **2004年10月**: Java 1.5(代号为 “老虎”)发布,此版本正式更名为 Java SE 5.0,并引入了许多重要的新特性,如泛型、可变参数、foreach 循环、自动装箱/拆箱等。 - **2006年2月**: Java 1.6(代号为 “野马...

    良葛格java5.0的学习笔记

    7. **Varargs(可变参数)**:Java 5.0引入了可变参数,允许一个方法接收不定数量的参数,这在编写函数式接口和便利方法时非常有用。 8. **Numeric Promotions(数值提升)**:在Java 5.0中,数值运算的类型提升变...

    java JDK 8学习笔记

    8. **新的集合工厂方法**:在`List`、`Set`和`Map`接口中添加了新的工厂方法,如`of()`和`ofNullable()`,可以方便地创建不可变集合。 9. **并行流(Parallel Streams)**:Stream API支持并行处理,可以充分利用...

    JavaJDK6学习笔记(林信良著)

    - **可变参数**:允许一个方法接受不定数量的参数,增强了方法的灵活性。 - **增强的for循环(foreach)**:简化了遍历数组和集合的操作,提高了代码的可读性。 - **动态类型语言支持**:通过引入`invokedynamic`...

    Java学习笔记(整理)

    6. **字符串处理**:String类在Java中是不可变的,了解其常用方法如concat、substring、indexOf、replace等对编程很有帮助。 7. **集合框架**:Java集合框架包括List、Set和Map接口,以及ArrayList、LinkedList、...

    Java定义形式及可变参数实例解析

    Java定义形式及可变参数实例解析 Java 中的方法是类或对象的一部分,不能独立存在。...Java 中的方法定义形式和可变参数实例解析是非常重要的知识点,对于 Java 开发者的学习和工作具有很大的参考价值。

    良葛格Java JDK 5.0学习笔记

    `...`操作符允许在方法声明中定义可变参数,使得调用时可以传入任意数量的相同类型的参数。这在处理不确定参数个数的情况时非常有用。 7. **枚举常量的构造器** 枚举类可以定义构造器,允许初始化枚举实例,提高...

    java web方向学习曲线图

    反射、泛型、注解、自动装箱和拆箱、枚举类、可变参数、可变返回类型、增强循环和静态导入是Java的高级特性,这些技术让开发者能够实现更高效、更灵活的代码。Java的IO和多线程是处理输入输出和并发处理的重要工具,...

    Java EE 学习方向

    - 自动装箱和拆箱、枚举类、可变参数、可变返回类型等新特性。 - 增强循环、静态导入等简化代码编写的方式。 通过学习这些内容,可以成为一名合格的Java程序员。 #### 二、Java Web核心技术 Java Web技术是Java...

    Java5.0学习笔记

    13. **可变参数的数组类型推断**:在Java 5.0中,如果方法参数是可变参数,编译器可以根据传入的实际参数推断出数组的类型。 14. **`compareTo()`方法的重写**:对于枚举类型,Java 5.0默认提供了按照枚举常量的...

    Java零基础-参数传递-2.md

    在Java中,可变参数列表允许方法接受任意数量的同类型参数。这通常在参数的数量不确定的情况下非常有用。 - **Varargs 的使用**:在方法声明中,可以通过在参数类型后加上三个点(`...`)来声明一个可变参数列表。...

    java 学习 java

    - **`StringBuffer`**:可变字符串缓冲区,可以在原有对象的基础上进行修改。 ### 16. 集合框架 - **`List`**:有序且允许重复元素。 - **`Set`**:不允许重复元素,无序。 - **`Map`**:保存键值对映射关系,键不...

Global site tag (gtag.js) - Google Analytics