[讨论] 方法重载的问题(方法一样,返回值不同)
richard_2010
2011-08-09
IcyFenix 写道 richard_2010 写道 看到这样的两句话:
“同一类中不能存在两个名字及描述符完全相同的方法”,这个大家都好理解。 “但在同一class文件中,两个方法可以拥有同样的特征签名,前提是返回值不能相同”,这里意思是虽然我们.java文件中两个同名同参数类型,返回值不同的方法是通不过编译的,但是在class文件中却可以存在这样的两个方法。 Q:我怎么去验证后面这句话的正确性,即怎样让一个class文件中存在签名一样但返回值不同的两个方法? LZ这个拿的是我书上的例子吧。 书上提到“同一个Class文件”的原文是“在Class文件格式之中,只要描述符不是完全一致的两个方法就可以共存”。后面还有跟着一句提到了相同的特征签名,原文为“两个方法如果有相同的名称和特征签名,但返回值不同,那它们也是可以合法地共存于一个Class文件中”,但这句话加了下面这个脚注: 注3:在《Java虚拟机规范第二版》(JDK 1.5修改后的版本)的“§4.4.4 Signatures”章节及《Java语言规范第三版》的“§8.4.2 Method Signature”章节中分别都定义了字节码层面的方法特征签名,以及Java代码层面的方法特征签名,特征签名最重要的任务就是作为方法独一无二不可重复的ID,在Java代码中的方法特征签名只包括了方法名称、参数顺序及参数类型,而在字节码中的特征签名还包括方法返回值及受查异常表,本书中如果指的是字节码层面的方法签名,笔者会加入限定语进行说明,也请读者根据上下文语境注意区分。 另外,这个story还有后续的进展:在JDK7中,javac的行为和ejc的一致了,这段代码都不能编译通过。 《深入理解java虚拟机》作者也来了,呵呵。 这段话是我以前做的笔记,不知道是《深入java虚拟机》里面还是在你博客看到的,最近几天正在翻买的你写的那本书,正好看到类似的段落,于是。。。 在JDK7中,javac的行为和ejc的一致了,这段代码都不能编译通过。 ---看样子JDK准备规范这种让人疑惑的行为了 |
|
wupuyuan
2011-09-02
应该来说,编译器和JVM的规范是不相同的,所以同一段程序会被两重规范约束。经过楼上几位大大的讨论又学得不少。
|