我的应用程序具有类似于此的结构:从超类方法调用子类方法?
class Father{
a(){ ... }
b(){a();}
}
class Son extends Father{
a(){ ..... }} //override
B()不overrided。 当我创建一个Son的实例并调用b()时,Father的a()被调用,但我希望它执行Son(如果对象是Son)。可能吗?
我的应用程序具有类似于此的结构:从超类方法调用子类方法?
class Father{
a(){ ... }
b(){a();}
}
class Son extends Father{
a(){ ..... }} //override
B()不overrided。 当我创建一个Son的实例并调用b()时,Father的a()被调用,但我希望它执行Son(如果对象是Son)。可能吗?
应该调用儿子的a
方法。如果不是,那么您要么不在Son
的实例上运行,要么您没有正确覆盖该方法。如果签名不完全相同,可能会发生这种情况。我会仔细检查你的实现,签名是完全一样的。此外,请尝试在a
的Son
实施上方抛出@Override
,看看是否收到编译错误。如果你这样做,那么你不是正确地重写该方法。
像这样
class Son extends Father{
@Override
a(){ ...}
}
此外,a
必须被保护或者公共的(包私有的,默认的,将只有Father
和Son
是在同一个包工作)。即Son
必须能够“看见”a()
方法。
谢谢! 'a()'是'private',''protected'它工作:) – supergiox
无/有
的行为。如果a
不是一个静态方法,那么Java使用dynamic binding,所以儿子的a()
方法被调用。
new Son().b()
将在Son中调用方法a()
。这就是所谓的动态绑定。
你有什么应该是正确的。方法调用被懒惰地绑定。这意味着当您在Son
对象中的任何位置调用方法a()
时,将会调用Son
的方法。
重写的方法在运行时解析,而重载的方法在编译时解析。因此,只需调用新的Son().a()就足够了。
在这种情况下应该调用儿子的a()。 –
@Hovercraft,我假设OP意味着b()没有被覆盖,并且他希望b()在子对象是子Son的时候调用a() –
@SamDeHaan:b **不必被覆盖* * –