首先描述問題
public ClassName() 和public ClassName(Object…parameters)是否是同一個函數?
俺的回答是不是滴,看測試代碼
1: public class Test
2: {
3: public Test()
4: {
5: System.out.println("No Constructor");
6: }
7: public Test(Object...keys)
8: {
9: System.out.println("Paramterized");
10: }
11: public static void main(String[] argvs)
12: throws Exception
13: {
14: Test a=new Test();
15: }
16: }
如果兩個建構函式是一樣的,則不可能編譯通過,所以不同。實際上,在函數簽名上也是有很大區別的,看main函數中的調用,這個預設函數的調用是“類的預設建構函式”。
我們再看看下面的例子:
1: public class Test
2: {
3: // public Test()
4: // {
5: // System.out.println("No Constructor");
6: // }
7: public Test(String...keys)
8: {
9: System.out.println("Paramterized");
10: }
11: public static void main(String[] argvs)
12: throws Exception
13: {
14: Test a=new Test();
15: }
16: }
注釋掉之後沒問題了,直接調用的可變參數的函數。那麼試試傳說中的反射構造捏:
1: public static void main(String[] argvs)
2: throws Exception
3: {
4: java.lang.reflect.Constructor c = Test.class.getConstructor();
5: System.out.println(null==c?"Not found":"found");
6: }
很遺憾,出錯鳥:
Exception in thread "main" java.lang.NoSuchMethodException: com.jeasonzhao.report.engine.test.Test.<init>()
at java.lang.Class.getConstructor0(Class.java:2647)
at java.lang.Class.getConstructor(Class.java:1629)
at com.jeasonzhao.report.engine.test.Test.main(Test.java:20)
這就是說,根本找不到這個東東啊。所以,間接證明了兩個建構函式不同,但是,以下的兩個是不是一樣地呢?
1: public Test(String...keys)
2: {
3: System.out.println("Paramterized");
4: }
5: public Test(String[] argc)
6: {
7: System.out.println("String Array Paramterized");
8: }
在IDE中,編譯不通過,出現了名字重複,實際上,這兩個倒是一樣的。
再玩點花哨的:
1: public Test(Object ...argc)
2: {
3: System.out.println("Object Array Paramterized");
4: if(null != argc)
5: {
6: int nid=0;
7: for(Object o : argc)
8: {
9: System.out.println("\t"+(nid++)+"> " + (null == o ? "[NULL]" : o.toString()));
10: }
11: }
12: }
13:
14: public static void main(String[] argvs)
15: throws Exception
16: {
17: Test t = new Test(1,"S"
18: ,new String[]{"I AM IN STRING ARRAY","STRING ARRAY END"}
19: ,new Object[]{"OBJ1","OBJ2"}
20: ,null
21: ,"END");
22: Test t2=new Test(new String[]{"I AM IN STRING ARRAY","STRING ARRAY END"});
23: Test t3=new Test(new Object[]{"OBJ1","OBJ2"});
24: }
猜測一下,輸出應該是什嗎?
關鍵是怎麼處理那個String[]和Object[].
結果是:
Object Array Paramterized
0> 1
1> S
2> [Ljava.lang.String;@1c78e57
3> [Ljava.lang.Object;@5224ee
4> [NULL]
5> END
Object Array Paramterized
0> I AM IN STRING ARRAY
1> STRING ARRAY END
Object Array Paramterized
0> OBJ1
1> OBJ2
至於為什麼,自己去想吧,很淺顯的
------------------------------------
Jeason Zhao
楚輕侯>>沈勝衣>>五鬥先生>>斛律光
某孔子團隊之走狗,某團隊之後勤,某團隊的CEO,家裡的不負責任的爸爸
我知道我是誰,我默默的活著,就像空氣。