首先请看如下两段代码
public class Overload {
public void method(String[] names) {
for (String string : names) {
System.out.println(string);
}
}
public void method(String... names) {
for (String string : names) {
System.out.println(string);
}
}
}
public class Overload {
public void method(String[] names) {
for (String string : names) {
System.out.println(string);
}
}
public void method(String name,String... names) {
for (String string : names) {
System.out.println(string);
}
}
}
有人会问了为什么第一段代码会报编译时错误,而第二段代码不会报错呢。
首先这里需要简单了解一下java5中新增的特性“可变参数列表”。
以(Object... obj)这样的形式声明一个数组型参数的方法就是可变参数列表,这样的好处有两个:
1.可以在使用这个方法的时候传入任意(甚至可以不传入任何参数)多个Object类型的参数
2.不必须在调用方法之前创建好数组后,才能把参数传入该方法,可变参数列表会自动将这些参数封装成为一个数组
这里有几点需要注意的地方:
1.可变参数列表本质上就是数组
2.Object可以用任何的类型替代
3.在一个方法中只能有一个可变参数列表,并且只能放在所有参数的最后一个位置上
好了,现在大家基本上了解了可变参数列表这个新的语言特性,下面回到文章开始的两段代码上来,第一段代码有两个方法method(String[] names)和method(String... names),根据刚刚讲到的可变参数列表本质上就是数组,也就是说String[] names与String... names这两种参数声明方式完全相同,所以这两个方法签名完全相同,不能够实现方法重载(Overload),会产生编译时错误(Compile Error)。
第二段的代码,有两个方法method(String[] names)和method(String name,String... names),参数的数量不相同,所以可以实现方法重载(Overload),不会产生任何错误。
最后使用一段代码来说明如何正确使用含有可变参数列表的方法
public class Overload {
public void method(String... names) {
for (String string : names) {
System.out.println(string);
}
}
public static void main(String[] args) {
Overload ol = new Overload();
String[] strings = {new String("a"),"b"};
ol.method(strings); //可以使用传入数组的方式调用方法
ol.method("a","b"); //也可以使用普通参数方式调用方法
ol.method(); //甚至不传入任何参数
}
}/* Output:
a
b
a
b
*/
补充:
为了让大家更好的理解可变参数列表就是数组,请看如下代码:
public class VariantList {
public static void main(String... args) {
System.out.println("main方法的参数也可以是String... args");
}
}/* Output:
main方法的参数也可以是String... args
*/
这里的public static void main(String... args)与public static void main(String[] args)完全相同
声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
分享到:
相关推荐
String类在Java中是不可变的,它的常用方法如concat()、substring()、indexOf()等是SCJP考试的常见考点。同时,了解StringBuilder和StringBuffer线程安全的字符串操作也是必要的。 六、IO流与NIO 输入/输出流(IO流...
SCJP
5. **变长参数**:使用`...`作为参数列表的最后部分,可以创建接受任意数量同一类型的参数的方法。 6. **for-each循环**:也称为增强的for循环,简化了遍历集合和数组的操作。 7. **变量声明提升**:局部变量声明...
### SCJP 中文大纲知识点详解 #### 第一部分:声明和访问控制 - **数组声明与初始化**:了解如何声明及初始化任何类型的数组,这包括基本数据类型数组以及对象类型的数组。 - **类、内部类、方法等的声明**:熟悉...
- 字符串在Java中是不可变对象,可以使用`+`操作符连接两个字符串,如A选项所示。B选项错误,因为不能使用数组下标访问字符串的字符。C选项中,`toUpperCase()`方法将字符串转换为大写。D选项错误,因为字符串不...
题目中给出的`foo`方法接受一个可变参数列表`int...x`。在Java中,可变参数可以用for-each循环遍历。所以,正确插入的代码片段是B. `for(int z : x) System.out.println(z);`。选项A中`foreach`语法错误,C中的`x....
SCJP(Sun Certified Java Programmer)中文大纲主要涵盖了Java编程的基础知识和核心概念,旨在帮助考生通过SCJP中文考试。以下是对大纲各部分的详细解析: **第一部分:声明和访问控制** 这部分要求考生掌握不同...
SCJP典型试题1000例 SCJP典型试题1000例 SCJP典型试题1000例
Java是一个面向对象的语言,SCJP考试中这部分内容非常关键: 1. **类和对象**:了解类的定义、对象的创建和访问权限(public, private, protected, default)。 2. **封装**:通过访问修饰符实现数据隐藏。 3. **...
在Java中,使用`...`可以创建一个可变长度的参数列表。可变长参数在底层被表示为数组。选项A使用了错误的`foreach`关键字,应该是`for-each`循环;选项B是正确的,它使用了`for-each`循环遍历可变长参数;选项C尝试...
5. **字符串处理**:Java中的String类是常考知识点,包括字符串的创建、不可变性、常用方法(如substring、indexOf、replace、concat等)以及StringBuilder和StringBuffer的使用。 6. **包装类与原始类型**:了解...
5. **字符串**:Java中的字符串是不可变的,因此需要熟悉String类和StringBuilder/StringBuffer类的使用。理解字符串连接的性能影响,以及如何使用正则表达式进行文本处理。 6. **异常处理**:掌握try-catch-...
- **使用静态方法、JavaBeans命名规则和可变参数 (Use Static Methods, JavaBeans Naming, & Var-Args)**: 静态方法的作用域、JavaBeans的标准命名习惯以及如何处理可变数量的参数。 ##### 两分钟演练 (Two-Minute ...
### SCJP 笔记与疑问整理 #### 阵列初始化 1. **正确初始化:** `int[] a = {1, 2, 3};` 正确地声明并初始化了一个整型数组,其中包含了三个元素1、2和3。 2. **匿名数组:** - `int[] a = new int[]{1, 2, 3};` ...
B选项使用了增强型for循环(也称为foreach循环)的正确形式,遍历可变参数列表`x`中的每个元素并打印出来,所以B选项是正确的。 C选项尝试使用`hasNext()`和`next()`方法,这些方法通常用于迭代器,但这里`x`不是...
这些工具在实际编程项目中不可或缺,熟悉它们的使用也是SCJP备考的一部分。 根据压缩包子文件的文件名称列表,我们可以推断出以下内容: 1. **软件工程考试.doc**:这可能是关于软件开发过程、方法和实践的一份...
可变参数列表(varargs)在方法签名中只能出现一次,并且必须是最后一个参数。例如,`doStuff(int… i,char… c)`是不合法的,但`doStuff(Object… y)`是可以的。同时,如果一个方法既有普通参数又有可变参数,这并...
SCJP认证是Java开发者职业生涯中的一个重要里程碑,它证明了持有者具备编写和维护高质量Java代码的基础技能。 在准备SCJP考试时,掌握以下核心知识点至关重要: 1. **Java语法**:包括基本数据类型、变量、常量、...