考虑一下此代码(为简洁起见,完整的类,运行良好的所有类都在一个类中)。
我的问题在代码清单后:
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);
}
}
}
问题:
我理解错了什么?为什么运行时在第一个for循环中解析子类,但在第二个for循环中不解析子类?
最后,将链接到有关Java中运行时/编译时多态性的清晰教程的链接。 (请不要发布Java教程的跟踪链接,当在适当的深度讨论更细微的差别时,我发现材料没有特别令人印象深刻)。
最佳答案
这是短期内的工作方式:
编译时间
运行时
您的列表是用小工具类型定义的。
for (Gadget gadget : l) {
gadget.switchon();
}
当您要求
gadget.switchon();
时,编译器将在Gadget类中寻找switchon()
方法,并且在那里,候选签名仅被确认为switchon()
。在执行期间,JVM将从Smartphone类中寻找
switchon()
方法,这就是为什么它显示正确的消息。这是第二个for循环中发生的情况
DemoPersonnel p = new DemoPersonnel();
for (Gadget gadget : l) {
p.demo(gadget);
}
在这种情况下,签名是针对两个对象
demo(Gadget g)
的,这就是为什么对于两个迭代都执行demo(Gadget g)
方法的原因。希望能帮助到你!