笔试一道重载题疑问

yooyoozoo 2009-11-22 05:52:01
一个方法test重载,
一个是test(String),一个是test(Object),
调用的时候 用test(null)为什么调用的是string的那个方法;

另再加一个test(StringBuffer),
这时候调用test(null),为什么又编译错误!

对解答者表示感谢!
...全文
301 35 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
你让编译器二选一,它不不怎么会啊!
  • 打赏
  • 举报
回复
糊涂中。。。。。。。。
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)

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧