java – 为什么叫super class方法?

前端之家收集整理的这篇文章主要介绍了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(两个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).

猜你在找的Java相关文章