【发布时间】:2013-09-19 12:21:37
【问题描述】:
class One {
public void doThing(One o) {System.out.println("One");}
}
class Two extends One{
public void doThing(Two t) {System.out.println("Two");}
}
public class Ugly {
public static void main(String[] args) {
Two t = new Two();
One o = t;
o.doThing(new Two());
}
}
结果:一个
class One {
public void doThing(One o) {System.out.println("One");}
}
class Two extends One{
public void doThing(Two t) {System.out.println("Two");}
}
public class Ugly {
public static void main(String[] args) {
Two t = new Two();
One o = t;
t.doThing(new Two());
}
}
结果:两个
我知道在运行时,即使对象引用是超类类型,实际的对象类型也是已知的,并且实际对象的方法将被调用。但如果是这种情况,那么在运行时应该调用doThing(Two t) 方法,而是调用超类方法doThing(One o)。如果有人解释一下我会很高兴
在第二段代码中打印“Two”。
问题:从超类引用调用时,它调用的是doThing(One o)
从子类引用调用时,它正在调用doThing(Two o)
注意:我知道我是超载而不是骑马。为了更清楚,我已经编辑了我的问题。
【问题讨论】:
-
你是重载,而不是覆盖
-
@nachokk :如果您已发布此链接作为答案,我会选择您作为已接受的答案。我从没想过要查找 Java 规范。谢谢,伙计.. dat 帮了大忙..
-
没关系,但您要查看的是动态方法调用的工作原理。
-
我浏览了整个文档.. :)
标签: java