我的应用程序的结构类似于:
class Father{
a(){ ... }
b(){a();}
}
class Son extends Father{
a(){ ..... }} //override
b() 未被覆盖。当我创建 Son 的实例并调用 b() 时,会调用父亲的 a(),但我希望它执行 Son 的实例(如果对象是 Son)。是否可以?
我的应用程序的结构类似于:
class Father{
a(){ ... }
b(){a();}
}
class Son extends Father{
a(){ ..... }} //override
b() 未被覆盖。当我创建 Son 的实例并调用 b() 时,会调用父亲的 a(),但我希望它执行 Son 的实例(如果对象是 Son)。是否可以?
否/是
如果a
不是静态方法,那么java使用动态绑定,所以a()
调用子的方法。
new Son().b()
将调用a()
Son 中的方法。这称为动态绑定。
a
应该调用Son 的方法。如果不是,那么您要么没有对 的实例进行操作,要么Son
没有正确覆盖该方法。如果签名不完全相同,则可能会发生这种情况。我会仔细检查您的实现签名是否完全相同。另外,尝试在实现@Override
之上抛出一个并查看是否出现编译错误。如果你这样做了,那么你就没有正确地覆盖该方法。Son
a
像这样
class Son extends Father{
@Override
a(){ ...}
}
此外,a
必须是受保护的或公共的(包私有,默认情况下,只有Father
在Son
同一个包中才有效)。即Son
必须能够“看到”该a()
方法。
你所拥有的应该是正确的。方法调用是惰性绑定的。这意味着当您在对象中的a()
任何位置调用该方法时,将调用该方法。Son
Son
重载的方法在运行时解析,而重载的方法在编译时解析。因此,只需调用 new Son().a() 就足够了。