java – 为什么叫super class方法?
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()在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的一个参数.
在第一种情况下,当你这样做 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). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |