社区
Java SE
帖子详情
笔试一道重载题疑问
yooyoozoo
2009-11-22 05:52:01
一个方法test重载,
一个是test(String),一个是test(Object),
调用的时候 用test(null)为什么调用的是string的那个方法;
另再加一个test(StringBuffer),
这时候调用test(null),为什么又编译错误!
对解答者表示感谢!
...全文
391
35
打赏
收藏
笔试一道重载题疑问
一个方法test重载, 一个是test(String),一个是test(Object), 调用的时候 用test(null)为什么调用的是string的那个方法; 另再加一个test(StringBuffer), 这时候调用test(null),为什么又编译错误! 对解答者表示感谢!
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
35 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
raul317
2009-11-24
打赏
举报
回复
学习了
圣诞老人123
2009-11-23
打赏
举报
回复
学习了。。。。
ChDw
2009-11-23
打赏
举报
回复
这里是编译器的优化,如果同时有两个方法入口符合,编译器会尽量找声明子类的那个方法
但是如果定义了test(StringBuffer),编译器就不知道应该使用哪个子类才合适了
code potato
2009-11-23
打赏
举报
回复
[Quote=引用楼主 yooyoozoo 的回复:]
一个方法test重载,
一个是test(String),一个是test(Object),
调用的时候 用test(null)为什么调用的是string的那个方法;
另再加一个test(StringBuffer),
这时候调用test(null),为什么又编译错误!
对解答者表示感谢!
[/Quote]
编译器总是根据调用方法时传入的参数类型来决定调用哪一个重载方法,如果参数为null则会首先试图找到Object类层次结构中唯一的类与之匹配,如果没有可以匹配的才会匹配Object类。
如果有两个以上的重载方法参数可以匹配null,并且参数类型在Object类层次结构中有父子关系或子孙关系,则匹配最底层的子类,如果不是以上关系编译器则会认为是二义性。String和StringBuffer就是兄弟关系,所以有二义性。
苍蝇①号
2009-11-23
打赏
举报
回复
学习
gqchen1981
2009-11-23
打赏
举报
回复
学习了。
秦π
2009-11-23
打赏
举报
回复
[Quote=引用 13 楼 zl3450341 的回复:]
引用 11 楼 amdgaming 的回复:
引用 3 楼 p17939845 的回复:
引用 1 楼 amdgaming 的回复:
兄弟 sjcp题吧
编译器很聪明的,它会找 除了object那个意外的一个,如果有2个,就是二异性 它就会报错了
其实就是这样。。。
编译器很聪明?聪明个头阿,已经都二义性了,只不过打了一个补丁,对Object特殊处理了一下。这应该算java语言不严谨的一个地方。
你懂个 屁啊, 你在看看大家的回答。。。。
[/Quote]
^_^
liujun3512159
2009-11-23
打赏
举报
回复
呵呵,编译器不知道怎么选择了,因为几个方法都可以调用,编译器在想,我该调用谁哦?最后没办法,我还是报错得了
MINISUDA
2009-11-23
打赏
举报
回复
[Quote=引用 12 楼 amdgaming 的回复:]
引用 9 楼 yooyoozoo 的回复:
那null也符合object 为什么不调用参数为object的那个方法呢?
我提了2个问题 麻烦大家分别介绍下 谢谢!
如果 只有 一个 那个 object参数 肯定会调用 它
但是现在除了 object还有string,它会先调用 string的那个函数,重载就是为了解决 子类的多种多样
编译器会首先 选择 除了 object类 之外 先调用,。。。如果有 stringbuffer ,那么 string和stringbuffer
都满足, 编译 器 调用没有办法 去选择调用哪个?所有 报错了。。。。
[/Quote]
正解
李子做IT
2009-11-23
打赏
举报
回复
#12的意思是
编译器会自动判断非Object方法调用.
有2个非OBJECT方法,调用null,则报异常
lwtazt
2009-11-23
打赏
举报
回复
你让编译器二选一,它不不怎么会啊!
网站推广优化yetaoaiueo
2009-11-23
打赏
举报
回复
糊涂中。。。。。。。。
whut0802
2009-11-23
打赏
举报
回复
学习了呵呵
yooyoozoo
2009-11-23
打赏
举报
回复
早看到大家的解答我笔试这个题也不会做的稀烂了!
谢谢各位!
wxzyydy
2009-11-23
打赏
举报
回复
ding
hejunlong007
2009-11-23
打赏
举报
回复
正常现象
wifewifewife
2009-11-23
打赏
举报
回复
[Quote=引用 28 楼 ghchen 的回复:]
在这个程序中, test.print(null)中的null即是String又是Object,那么要执行那个函数呢?结果是它执行了 public void print(String some),原因就是准确性原则,String继承自Object.在java看来,在这个例子中说null是String类型的比说null是Object类型的更为准确.
String和StringBuffer之间不存在继承关系,因此不能说null属于它们两个中的那个类更准确,于是程序在执行时就会不知道该调用public void print(String some),还是该调用 public void print(StringBuffer some).
[/Quote]
同意这个观点.
bayougeng
2009-11-23
打赏
举报
回复
[Quote=引用 28 楼 ghchen 的回复:]
在这个程序中, test.print(null)中的null即是String又是Object,那么要执行那个函数呢?结果是它执行了 public void print(String some),原因就是准确性原则,String继承自Object.在java看来,在这个例子中说null是String类型的比说null是Object类型的更为准确.
String和StringBuffer之间不存在继承关系,因此不能说null属于它们两个中的那个类更准确,于是程序在执行时就会不知道该调用public void print(String some),还是该调用 public void print(StringBuffer some).
[/Quote]
貌似正解。
ghchen
2009-11-23
打赏
举报
回复
在这个程序中, test.print(null)中的null即是String又是Object,那么要执行那个函数呢?结果是它执行了 public void print(String some),原因就是准确性原则,String继承自Object.在java看来,在这个例子中说null是String类型的比说null是Object类型的更为准确.
String和StringBuffer之间不存在继承关系,因此不能说null属于它们两个中的那个类更准确,于是程序在执行时就会不知道该调用public void print(String some),还是该调用 public void print(StringBuffer some).
holsten32
2009-11-23
打赏
举报
回复
顶
加载更多回复(15)
详解
一道
C++
笔试
题
,考察
重载
、覆盖、多态
C++版看到的,说是面试宝典里的
题
目,考察
重载
、覆盖、多态等概念,比较有代表性。今天早上远程辅导 Yan Wang 同学学习 Qt 时还想到了这个
题
目,如果你能够正确理解这个
题
目,说明对于 C++ 中的函数
重载
、覆盖、虚函数、多态等有了正确的认识。然后呢,再来学习 Qt 就顺风顺水了。
【C++
笔试
强训】第八天
笔试
强训第八天,再一次感谢自己的坚持
Java SE
62,620
社区成员
307,251
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章