以下内容有选择地摘自《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()方法。于是书中所说的令人迷惑的地方在哪里?还有,引用中的那句话要怎么理解?
MMTTMM
相关分类