1.可變參數列表的簡單實現
當調用方法時,方法的參數個數或類型未知時,稱其為可變參數列表。在以前的Java代碼中,可以使用Object數組來實現這樣的功能。因為,所有的類都是直接或間接繼承于Object類。
VarArgs.java
package sample;
class A1{}
public class VarArgs {
static void printArray(Object[] args){
for(Object obj:args)
System.out.print(obj+" ");
System.out.println();
}
public static void main(String[] args){
printArray(new Object[]{
new Integer(47),new Float(3.14),new Double(11.11)
});
printArray(new Object[]{"one","two","three"});
printArray(new Object[]{new A1(),new A1(),new A1()});
}
}
|
結果:
47 3.14 11.11
one two three
sample.A1@a90653 sample.A1@de6ced sample.A1@c17164
這里printArray方法使用Object數組作為參數,并使用foreach語法遍歷數組,打印每個對象。
2.Java SE5實現可變參數列表
同樣的方法,參數可以這樣定義,(Object…args),這樣達到同樣的效果。
NewVarArgs.java
package sample;
class A{}
public class NewVarArgs {
static void printArray(Object...args){
for(Object obj:args)
System.out.print(obj+" ");
System.out.println();
}
public static void main(String[] args){
printArray(new Integer(47),new Float(3.14),new Double(11.11));
printArray(47,
printArray("one","two","three");
printArray(new A(),new A(),new A());
printArray((Object[])new Integer[]{1,2,3,4});
printArray();
}
}
|
結果:
47 3.14 11.11
47 3.14 11.11
one two three
sample.A@a90653 sample.A@de6ced sample.A@c17164
1 2 3 4
這里沒有顯式的使用數組作為參數,但編譯器實際上會為你填充數組。所以同樣可以使用foreach語法來遍歷之。
注意倒數第二行,編譯器已經發現它是一個數組,所以不會在其上執行任何轉換。最后一行表明,可以傳遞零個參數。
也可以指定所有可變參數的類型,下面的程序指定所有可變參數都必須是String。
OptionalArguments.java
package sample;
public class OptionalArguments {
static void f(String...trailing){
for(String s:trailing)
System.out.print(s+" ");
System.out.println();
}
public static void main(String[] args){
f("one");
f("two","three");
f();
}
}
|
結果:
one
two three
可以在可變參數列表中同時使用原始類型與包裝類。
AutoboxingVarargs.java
package sample;
public class AutoboxingVarargs {
public static void f(Integer...args){
for(Integer i:args)
System.out.print(i+" ");
System.out.println();
}
public static void main(String[] args){
f(new Integer(1),new Integer(2));
f(3,4,5,6,7,8,9);
f(10,new Integer(11),12);
}
}
|
結果:
1 2
3 4 5 6 7 8 9
10 11 12
3.可變參數列表的重載(Overloading)
如果出現重載的情況,則編譯器會自動調用最適合的方法匹配之。
OverloadingVarargs.java
package sample;
public class OverloadingVarargs {
static void f(Character...args){
System.out.print("first ");
for(Character c:args)
System.out.print(c+" ");
System.out.println();
}
static void f(Integer...args){
System.out.print("second ");
for(Integer i:args)
System.out.print(i+" ");
System.out.println();
}
static void f(Long...args){
System.out.print("third ");
for(Long l:args)
System.out.print(l+" ");
System.out.println();
}
static void f(Double...args){
System.out.print("forth ");
for(Double d:args)
System.out.print(d+" ");
System.out.println();
}
public static void main(String[] args){
f('a','b','c');
f(1);
f(2,1);
f(0.1);
|
結果:
first a b c
second 1
second 2 1
forth 0.1
third 0
但下面的情況是不允許的,即某個方法中增加一個非可變參數。
OverloadingVarargs2.java
package sample;
public class OverloadingVarargs2 {
static void f(float i,Character...args){
System.out.println("first");
}
static void f(Character...args){
System.out.println("second");
}
public static void main(String[] args){
f(1,'a');
f('a','b');//Error
}
}
|
但可以這樣解決問題。
package sample;
public class OverloadingVarargs2 {
static void f(float i,Character...args){
System.out.println("first");
}
static void f(char c,Character...args){
System.out.println("second");
}
public static void main(String[] args){
f(1,'a');
f('a','b');
}
}
|
即重載的方法必須保持一致的參數形式。
posted on 2007-08-19 05:03
前方的路 閱讀(6783)
評論(0) 編輯 收藏 所屬分類:
Java技術