考虑这段代码(为了简洁起见,完整的类,运行良好,一个类中的所有类)。
我的问题在代码清单之后:
import java.util.LinkedList;
import java.util.List;
class Gadget {
public void switchon() {
System.out.println("Gadget is Switching on!");
}
}
interface switchonable {
void switchon();
}
class Smartphone extends Gadget implements switchonable {
@Override
public void switchon() {
System.out.println("Smartphone is switching on!");
}
}
class DemoPersonnel {
public void demo(Gadget g) {
System.out.println("Demoing a gadget");
}
public void demo(Smartphone s) {
System.out.println("Demoing a smartphone");
}
}
public class DT {
/**
* @param args
*/
public static void main(String[] args) {
List<Gadget> l = new LinkedList<Gadget>();
l.add(new Gadget());
l.add(new Smartphone());
for (Gadget gadget : l) {
gadget.switchon();
}
DemoPersonnel p = new DemoPersonnel();
for (Gadget gadget : l) {
p.demo(gadget);
}
}
}
问题:
从编译器的角度来看,Smartphone 中 switchon 方法的起源是什么?它是从基类 Gadget 继承的吗?或者它是 switchonable 接口要求的 switchon 方法的实现?注释在这里有什么不同吗?
在 main 方法中,第一个循环:在这里,我们看到了一个运行时多态的情况——即,当第一个 for 循环运行时,调用了 gadget.switchon(),它首先打印“Gadget is正在打开”,然后它打印“智能手机正在开机”。但是在第二个循环中,这个运行时解析并没有发生,并且对 demo 的两个调用的输出都是“Demoing a gadget”,而我期望它在第一次迭代时打印“Demoing a gadget”和“Demoing a smartphone”第二次。
我理解错了什么?为什么运行时在第一个 for 循环中解析子类,但在第二个 for 循环中不解析?
最后,一个关于Java运行时/编译时多态性的清晰教程的链接将不胜感激。(请不要张贴 Java 教程跟踪链接,在深入讨论更细微的差别时,我没有发现这些材料特别令人印象深刻)。