3

我的应用程序的结构类似于:

class Father{
a(){ ... }

b(){a();}
}

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

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

4

4 回答 4

5

否/是

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

如果a不是静态方法,那么java使用动态绑定,所以a()调用子的方法。

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

于 2011-08-10T18:51:01.423 回答
4

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

像这样

class Son extends Father{
  @Override
  a(){ ...}
}

此外,a必须是受保护的或公共的(包私有,默认情况下,只有FatherSon同一个包中才有效)。即Son必须能够“看到”该a()方法。

于 2011-08-10T18:55:12.583 回答
-1

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

于 2011-08-10T18:53:40.763 回答
-1

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

于 2011-08-10T19:00:03.547 回答