A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

比如两个方法 void f() {}
                      int    f() {}
从我们人的角度,我们很容易去区分这是两个不同的方法。但是编译器为什么就不能做出区分呢?
通常我们在调用一个方法时,调用形式是:对象引用.f() ,不需要标明方法的返回类型,并且在某些情况下
调用方法并不是为了取得一个返回值,而是为了得到这个方法产生的副作用结果,这时甚至没有一个对象来
接收方法的返回值,这时候编译器就可能傻了,它不会联系上下文,更不知道我们想要的输出结果,它只会检查语法。
所以不能根据返回值来重载一个方法。

这是个人的理解,欢迎补充,和更正。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

4 个回复

倒序浏览
编译器就管传参就行了,返回值不同那就传呗,传完了一计算出俩结果,他当然懵。当然传参之前应该就已经加载完代码了,知道会出现两个结果的现象,所以直接报错了

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
重载的前提是方法名相同,但参数类型或个数不同。当访问重载方法时,编译器回比较参数类型与实际调用方法中使用值的类型,来选择正确的方法,否则编译器会报错。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
你的这种想法很单纯,能解决问题,这也可能是JAVA开发人员为什么要这么设计编译器的原因;
如果你看过编译原理方面的书的话,你就应该明白:
你的所有方法在编译成二进制文件的时候,都会对应一串符号,而这个符号的产生是根据方法名和参数的信息产生的(就像序列化的号码或者hashCode);系统完全根据这串符号,来判断函数。
如果方法名相同而参数不同,产生的符号串也不同,编译器认为是两个函数,于是重载就产生了。
C语言不能重载的原因就是因为它只根据方法名来生成字符串,至少gcc是这样的;C++能重载也是这个原理。

对于咱们来说,只要知道是重载就行了,如果要刨根问底,还要看看编译原理。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
行如止水 发表于 2014-3-3 12:00
你的这种想法很单纯,能解决问题,这也可能是JAVA开发人员为什么要这么设计编译器的原因;
如果你看过编译 ...

你这一句话把什么问题都解决了:根据方法名和参数的信息产生................
呵呵,读书不过,受教了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马