猿问

关于Java动态绑定的疑惑

以下内容有选择地摘自《Java编程思想》:
enumNote{
MIDDLE_C,C_SHARP,B_FLAT
}
classInstrument{
publicvoidplay(Noten){
System.out.println("Instrument.play()"+n);
}
}
classWindextendsInstrument{
@Override
publicvoidplay(Noten){
System.out.println("Wind.play()"+n);
}
}
classBrassextendsInstrument{
@Override
publicvoidplay(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()方法。于是书中所说的令人迷惑的地方在哪里?还有,引用中的那句话要怎么理解?
茅侃侃
浏览 351回答 2
2回答

MMTTMM

Java中属性绑定到类型,方法绑定到对象.编译时期,系统并不清楚变量是哪个类的实例。具体调用哪个类的方法运行时才能决定。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答