JAVA預設建構函式和可變參數建構函式之間的區別

來源:互聯網
上載者:User

首先描述問題

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,家裡的不負責任的爸爸

我知道我是誰,我默默的活著,就像空氣。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.