为了账号安全,请及时绑定邮箱和手机立即绑定

关于Java动态绑定的疑惑

关于Java动态绑定的疑惑

茅侃侃 2019-04-09 20:25:09
以下内容有选择地摘自《Java编程思想》:enumNote{MIDDLE_C,C_SHARP,B_FLAT}classInstrument{publicvoidplay(Noten){System.out.println("Instrument.play()"+n);}}classWindextendsInstrument{@Overridepublicvoidplay(Noten){System.out.println("Wind.play()"+n);}}classBrassextendsInstrument{@Overridepublicvoidplay(Noten){System.out.println("Brass.play()"+n);}}publicclassMusic{publicstaticvoidtune(Instrumenti){i.play(Note.B_FLAT);}publicstaticvoidmain(String[]args){Windflute=newWind();tune(flute);}}之后,书中提到:请观察一下tune()方法,它接受一个Instrument引用。那么在这种情况下,编译器怎样才能知道这个Instrument引用指向的是Wind对象,而不是Brass对象呢?实际上,编译器无法得知。上述程序之所以令人迷惑,主要是因为前期绑定。因为,当编译器只有一个Instrument引用时,它无法知道究竟调用哪个方法才对。(这句话要怎么理解?)所以,我的疑问是:既然tune()内接的是Wind对象flute,那么它就应该知道调用Wind.play()方法,而不是调用Instrument.play()方法或Brass.play()方法。如果Wind没有覆盖play()方法,那么最终应该调用基类Instrument.play()方法。于是书中所说的令人迷惑的地方在哪里?还有,引用中的那句话要怎么理解?
查看完整描述

2 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

Java中属性绑定到类型,方法绑定到对象.
编译时期,系统并不清楚变量是哪个类的实例。具体调用哪个类的方法运行时才能决定。
                            
查看完整回答
反对 回复 2019-04-09
  • 2 回答
  • 0 关注
  • 350 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信