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)
注意:我知道我超载而不是骑车。我已经对我的问题进行了编辑,以使其更加清晰。
在编译时,编译器会在类中搜索该One
方法,doThing(Two t)
但是由于没有带有该签名的方法,因此它开始扩大搜索范围和查找范围doThing(One o)
。然后,它保存带有描述符的二进制文件one parameter whose type is One : void
。在运行时,由于调用方法的对象是类型Two
,因此在类中Two
它将查找与描述符匹配的方法,而不会在将二进制doThing
对象Two
视为描述符的情况下搜索接受对象的方法,因此它将调用链接到方法doThing(One o)
。
Java规范对此有很大帮助。这是链接
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句