java 中的点_java————形参中的点点点 | 学步园
轉(zhuǎn)自:http://zhidao.baidu.com/question/149668626.html
main方法的簽名其實(shí)可以這樣寫:
public static void main(String... args)//方法1
它也可以運(yùn)行.
并且,如果同時(shí)還存在
public static void main(String[] args)//方法2
會(huì)報(bào)已經(jīng)存在重復(fù)的方法的錯(cuò)誤.
由此可見,String... args跟String[] args對(duì)于虛擬機(jī)來說其實(shí)是一回事.
而且,在方法內(nèi),通過...傳進(jìn)來的參數(shù)的使用方法也跟一個(gè)數(shù)組完全無二,可以for循環(huán),甚至可以直接轉(zhuǎn)換:
public static void main(String... args)
{
String[] ss=args;
}
但對(duì)于程序員來說卻還是有差別的.
1.調(diào)用
我們只能這樣調(diào)用方法2:
main(new String[]{});
即,方法2只能接受String數(shù)組做參數(shù).
而我們陌生的方法1可強(qiáng)了,用以下參數(shù)調(diào)用,照單全收:
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也可以是一個(gè)特殊的String)
2.參數(shù)位置
使用...的參數(shù)只能是最后一個(gè)參數(shù).不然誰知道你調(diào)用的時(shí)候,點(diǎn)點(diǎn)點(diǎn)匹配到哪個(gè)實(shí)參?
public static void main(String[] args,int index)//可以
public static void main(String... args,int index)//不行!
3.重載
假設(shè)有以下兩個(gè)方法:
public static void main(String... args)//方法1
public static void main(String a,String... args)//方法3
從語法上來看,這個(gè)重載完全沒有錯(cuò)誤,eclipse也沒有報(bào)錯(cuò).但是當(dāng)調(diào)用時(shí)使用的參數(shù)個(gè)數(shù)大于這些方法中點(diǎn)點(diǎn)點(diǎn)參數(shù)前面的參數(shù)個(gè)數(shù)時(shí),eclipse就會(huì)發(fā)現(xiàn)這個(gè)錯(cuò)誤了.很拗口是不是?嘿嘿~還是舉例來說吧.以上這兩個(gè)方法,如果調(diào)用時(shí)
main();
編譯器會(huì)認(rèn)出這個(gè)調(diào)用的是方法1.但是如果調(diào)用時(shí)
main("");
編譯器就瘋了...因?yàn)橐粋€(gè)String參數(shù),既符合方法1的點(diǎn)點(diǎn)點(diǎn),也符合方法3的String+點(diǎn)點(diǎn)點(diǎn),編譯器就不知道調(diào)用的是哪個(gè)方法了.
String[]參數(shù)不會(huì)有這種問題.
所以重載時(shí)要注意,如果點(diǎn)點(diǎn)點(diǎn)參數(shù)前面有跟它類型相同的參數(shù)...最好的方法,似乎就是換回?cái)?shù)組形式了,要么就給方法改個(gè)名字吧.
4.遇上泛型加外包
用個(gè)實(shí)例來說
java.util.Arrays是個(gè)工具類,所有方法都是靜態(tài)的,對(duì)數(shù)組的操作.里面有個(gè)方法asList(T... args),用來把類型T的數(shù)組轉(zhuǎn)化成List.
這是個(gè)很有用的方法,在絕大多數(shù)情況下都能如你所愿.
但是,你可以試試下面的寫法
int[] is=...//自定義的數(shù)組,或者從什么地方獲取來的數(shù)組
List list=Arrays.asList(is);
很不幸,不要說執(zhí)行,編譯都通不過.錯(cuò)誤的意思大概是:
不能將List轉(zhuǎn)化成List
明白了吧?
你的設(shè)想是,把int[]中的每一個(gè)元素對(duì)應(yīng)T...中的每一個(gè)點(diǎn),
可編譯器不這么想.因?yàn)閕nt是原始類型,不是Object的子類.而泛型T隱含的條件是T extends Object.所以編譯器不會(huì)把每一個(gè)int看做T,不會(huì)把int[]看做T點(diǎn)點(diǎn)點(diǎn).雖然java已經(jīng)支持自動(dòng)將原始類型封包成外包類,但那是單個(gè)的情況.
而數(shù)組(不管什么類型)則是一種特殊的類型,是Object的子類,所以編譯器覺得整個(gè)int[]對(duì)應(yīng)一個(gè)T,你調(diào)用的方法是asList(int[]... args)而不是你想象中的asList(Integer...)
總結(jié)
以上是生活随笔為你收集整理的java 中的点_java————形参中的点点点 | 学步园的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java me基础教程 pdf_Java
- 下一篇: 设施农用地备案流程图片(设施农用地备案流