我的应用程序具有与此类似的结构:
class Father{
a(){ ... }
b(){a();}
}
class Son extends Father{
a(){ ..... }} //override
b()未被覆盖。 当我创建Son的一个实例并且我调用b()时,父的a()被调用,但我希望它执行Son的一个(如果对象是Son)。可能吗?
答案 0 :(得分:5)
否/是
如果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
必须是受保护的或公开的(包私有,默认情况下,仅当Son
和Son
位于同一个包中时才有效)。即a()
必须能够“看到”{{1}}方法。
答案 2 :(得分:-1)
你所拥有的应该是正确的。方法调用是懒惰的绑定。这意味着当您在a()
对象中的任何位置调用方法Son
时,将会调用Son
的方法。
答案 3 :(得分:-1)
重写的方法在运行时解析,而重载的方法在编译时解析。因此,只需调用新的Son()。a()就足够了。