以下內(nèi)容有選擇地摘自《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引用時,它無法知道究竟調(diào)用哪個方法才對。(這句話要怎么理解?)所以,我的疑問是:既然tune()內(nèi)接的是Wind對象flute,那么它就應該知道調(diào)用Wind.play()方法,而不是調(diào)用Instrument.play()方法或Brass.play()方法。如果Wind沒有覆蓋play()方法,那么最終應該調(diào)用基類Instrument.play()方法。于是書中所說的令人迷惑的地方在哪里?還有,引用中的那句話要怎么理解?
關(guān)于Java動態(tài)綁定的疑惑
翻翻過去那場雪
2019-04-08 11:18:28