Java 方法签名详解及实例代码
java方法签名,我想做java开发的朋友也知道,方法签名的重要性,是方法重载的一个比较好的解释,尤其是在后续优化方面,这里记录下,有看到的朋友也可看下,
方法签名的意义
对于同名不同类、同类不同名的方法,方法签名的意义并不是很大,但是对于重载方法来说,方法签名的意义就十分巨大了。由于重载方法之间的方法名是相同的,那么我们势必要从构成方法的其他几个要素中找到另一个要素与方法名组成能够唯一标示方法的签名,方法体当然不予考虑。那么就是形参列表和返回值了,但是由于对于调用方法的人来说,方法的形参数据类型列表的重要程度要远远高于返回值,所以方法签名就由方法名+形参列表构成,也就是说,方法名和形参数据类型列表可以唯一的确定一个方法,与方法的返回值一点关系都没有,这是判断重载重要依据,所以,以下的代码是不允许的
publiclongaaaa(){ } publicintaaaa(){ }
方法签名的格式
首先我们先看几个方法以及他们的方法签名:
publicvoidtest1(){}test1()V publicvoidtest2(Stringstr)test2(Ljava/lang/String;)V publicinttest3(){}test3()I
从以上三个例子,我们就可以很简单的看出一些小小的规律:
JVM为我们提供的方法签名实际上是由方法名(上文的例子为了简单没有写出全类名)、形参列表、返回值三部分构成的,基本形式就是:
全类名.方法名(形参数据类型列表)返回值数据类型
Java方法签名中特殊字符/字母含义
特殊字符 | 数据类型 | 特殊说明 |
---|---|---|
V | void | 一般用于表示方法的返回值 |
Z | boolean | |
B | byte | |
C | char | |
S | short | |
I | int | |
J | long | |
F | float | |
D | double | |
[ | 数组 | 以[开头,配合其他的特殊字符,表示对应数据类型的数组,几个[表示几维数组 |
L | 全类名; | 引用类型以L开头;结尾,中间是引用类型的全类名 |
一定要注意的是方法重载时,方法返回值没有什么意义,是由方法名和参数列表决定的
利用javap生成方法签名
类库类
$javap-sjava.lang.String Compiledfrom"String.java" publicfinalclassjava.lang.Stringextendsjava.lang.Objectimplementsjava.io.Serializable,java.lang.Comparable,java.lang.CharSequence{ publicstaticfinaljava.util.ComparatorCASE_INSENSITIVE_ORDER; Signature:Ljava/util/Comparator; publicjava.lang.String(); Signature:()V publicjava.lang.String(java.lang.String); Signature:(Ljava/lang/String;)V publicjava.lang.String(char[]); Signature:([C)V publicjava.lang.String(char[],int,int); Signature:([CII)V publicjava.lang.String(int[],int,int); Signature:([III)V publicjava.lang.String(byte[],int,int,int); Signature:([BIII)V publicjava.lang.String(byte[],int); Signature:([BI)V publicjava.lang.String(byte[],int,int,java.lang.String)throwsjava.io.UnsupportedEncodingException; Signature:([BIILjava/lang/String;)V publicjava.lang.String(byte[],int,int,java.nio.charset.Charset); Signature:([BIILjava/nio/charset/Charset;)V publicjava.lang.String(byte[],java.lang.String)throwsjava.io.UnsupportedEncodingException; Signature:([BLjava/lang/String;)V publicjava.lang.String(byte[],java.nio.charset.Charset); Signature:([BLjava/nio/charset/Charset;)V publicjava.lang.String(byte[],int,int); Signature:([BII)V ...
自定义类
packagecom.demo; publicclassSigTest{ publicstaticfinalStringname=null; publicintgetName(int[]data,longindex){ return0; } }
输出
$javacSigTest.java $javap-s-pcom.demo.SigTest Compiledfrom"SigTest.java" publicclasscom.demo.SigTestextendsjava.lang.Object{ publicstaticfinaljava.lang.Stringname; Signature:Ljava/lang/String; publiccom.demo.SigTest(); Signature:()V publicintgetName(int[],long); Signature:([IJ)I static{}; Signature:()V }
-s表示打印签名信息
-p表示打印所有函数和成员的签名信息,默认只打印public的签名信息
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!