这几天不知道怎么了,总是碰到各种各样的NoSuchMethodException异常,但是Java为了方便值给了我们方法的方法签名,这对于刚接触的程序猿来说貌似有点蛋疼。今天从网上好好的百度/google了一下,结合自己掌握的知识,现将有关方法签名的相关信息记录下来,以备以后使用。
首先,先来介绍一下什么是方法签名,说到方法签名,我们就不得不提到java中的方法重载,提到方法重载就不得不提到面向对象的多态,好吧,以上只是说说而已。方法签名,顾名思义,方法的签名,来区分不同方法的标示符。大家都知道java中的方法是必须依赖于类的,方法又是由方法名、形参列表、返回值以及方法体构成的。
其实对于同名不同类、同类不同名的方法,方法签名的意义并不是很大,但是对于重载方法来说,方法签名的意义就十分巨大了。由于重载方法之间的方法名是相同的,那么我们势必要从构成方法的其他几个要素中找到另一个要素与方法名组成能够唯一标示方法的签名,方法体当然不予考虑。那么就是形参列表和返回值了,但是由于对于调用方法的人来说,方法的形参数据类型列表的重要程度要远远高于返回值,所以方法签名就由方法名+形参列表构成,也就是说,方法名和形参数据类型列表可以唯一的确定一个方法,与方法的返回值一点关系都没有,这是判断重载重要依据,所以,以下的代码是不允许的。
[java] view plain copy
- 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开头、;结尾,中间是引用类型的全类名 |
以上就是对于方法签名以及方法重载的小小解释、说明。一定要注意的是方法重载时,方法返回值没有什么意义,是由方法名和参数列表决定的。