从超类方法调用子类方法?

时间:2011-08-10 18:49:03

标签: java override subclass superclass extends

我的应用程序具有与此类似的结构:

class Father{
a(){ ... }

b(){a();}
}

class Son extends Father{
a(){ ..... }} //override

b()未被覆盖。 当我创建Son的一个实例并且我调用b()时,父的a()被调用,但我希望它执行Son的一个(如果对象是Son)。可能吗?

4 个答案:

答案 0 :(得分:5)

否/是

  • 不:“当我创建一个Son的实例并且我调用b()时,父亲的a()被称为”那是错的!
  • 是的:“但我希望它能执行儿子(如果对象是儿子)。是否可能?” - 这就是Java的行为

如果a不是静态方法,那么java使用dynamic binding,因此调用了儿子的a()方法。

new Son().b()将调用Son中的方法a()。这称为动态绑定。

答案 1 :(得分:4)

应该调用Son的a方法。如果不是,那么您要么不在Son的实例上操作,要么您没有正确覆盖该方法。如果签名不完全相同,则可能发生这种情况。我会仔细检查你的实现,签名是完全一样的。另外,尝试在@Override Son a实现之上抛出class Son extends Father{ @Override a(){ ...} } ,看看是否出现编译错误。如果您这样做,那么您没有正确地覆盖该方法。

喜欢这个

a

此外,Father必须是受保护的或公开的(包私有,默认情况下,仅当SonSon位于同一个包中时才有效)。即a()必须能够“看到”{{1}}方法。

答案 2 :(得分:-1)

你所拥有的应该是正确的。方法调用是懒惰的绑定。这意味着当您在a()对象中的任何位置调用方法Son时,将会调用Son的方法。

答案 3 :(得分:-1)

重写的方法在运行时解析,而重载的方法在编译时解析。因此,只需调用新的Son()。a()就足够了。