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(一o)
当从子类引用调用它调用doThing(两个o)
注意:我知道我已经超载,而不是骑马.我已经编辑了我的问题,以便更清楚.
解决方法
方法doThing()在One和Two中具有不同的方法签名.
One.doThing(One one) Two.doThing(Two two)
既然,签名不匹配,Two.doThing(Two)不会覆盖One.doThing(One),因为o是类型One,所以调用One.doThing().
还要注意的是,One.doThing(One)可以将Two作为One.doThing(One)的参数,作为Two扩展One的一个参数.
Basically,“@nachokk – You are Overloading,not Overriding”
在第一种情况下,当你这样做
Two t = new Two(); One o = t; o.doThing(new Two());
所以,o是One和Two.doThing(Two)的一个实例,不可用于o因此调用One.doThing(One)
在第二种情况下,
Two t = new Two(); One o = t; t.doThing(new Two());
t是Two的一个实例,因此称为Two.doThing(Two).