Java中的方法簽名
這幾天不知道怎麼了,總是碰到各種各樣的NoSuchMethodException異常,但是Java為了方便值給了我們方法的方法簽名,這對於剛接觸的程式猿來說貌似有點蛋疼。今天從網上好好的百度/google了一下,結合自己掌握的知識,現將有關方法簽名的相關資訊記錄下來,以備以後使用。
首先,先來介紹一下什麼是方法簽名,說到方法簽名,我們就不得不提到java中的方法過載,提到方法過載就不得不提到面向物件的多型,好吧,以上只是說說而已。方法簽名,顧名思義,方法的簽名,來區分不同方法的標示符。大家都知道java中的方法是必須依賴於類的,方法又是由方法名、形參列表、返回值以及方法體構成的。
其實對於同名不同類、同類不同名的方法,方法簽名的意義並不是很大,但是對於過載方法來說,方法簽名的意義就十分巨大了。由於過載方法之間的方法名是相同的,那麼我們勢必要從構成方法的其他幾個要素中找到另一個要素與方法名組成能夠唯一標示方法的簽名,方法體當然不予考慮。那麼就是形參列表和返回值了,但是由於對於呼叫方法的人來說,方法的形引數據型別列表的重要程度要遠遠高於返回值,所以方法簽名就由方法名+形參列表構成,也就是說,方法名和形引數據型別列表可以唯一的確定一個方法,與方法的返回值一點關係都沒有,這是判斷過載重要依據,所以,以下的程式碼是不允許的
public long aaaa(){
}
public int aaaa(){
}
接下來,就來解釋一下,當程式出現NoSuchMethodException時,JVM為我們提供的異常資訊究竟是什麼意思。首先我們先看幾個方法以及他們的方法簽名:
public void test1(){} test1()V
public void test2(String str) test2(Ljava/lang/String;)V
public int test3(){} test3()I
從以上三個例子,我們就可以很簡單的看出一些小小的規律:
JVM為我們提供的方法簽名實際上是由方法名(上文的例子為了簡單沒有寫出全類名)、形參列表、返回值三部分構成的,基本形式就是:
全類名.方法名(形引數據型別列表)返回值資料型別
我們知道了JVM提供的方法簽名的結構之後還是不夠,因為JVM是並沒有特別明確的將資料型別寫出來,而是提供了特殊的表示法,下表就是對特殊表示字元、字母與對應資料型別的關係:
特殊字元 | 資料型別 | 特殊說明 |
V | void | 一般用於表示方法的返回值 |
Z | boolean | |
B | byte | |
C | char | |
S | short | |
I | int | |
J | long | |
F | float | |
D | double | |
[ | 陣列 | 以[開頭,配合其他的特殊字元,表示對應資料型別的陣列,幾個[表示幾維陣列 |
L全類名; | 引用型別 | 以L開頭、;結尾,中間是引用型別的全類名 |
以上就是對於方法簽名以及方法過載的小小解釋、說明。一定要注意的是方法過載時,方法返回值沒有什麼意義,是由方法名和引數列表決定的。