2011-08-10 70 views
3

我的应用程序具有类似于此的结构:从超类方法调用子类方法?

class Father{ 
a(){ ... } 

b(){a();} 
} 

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

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

+0

在这种情况下应该调用儿子的a()。 –

+0

@Hovercraft,我假设OP意味着b()没有被覆盖,并且他希望b()在子对象是子Son的时候调用a() –

+0

@SamDeHaan:b **不必被覆盖* * –

回答

4

应该调用儿子的a方法。如果不是,那么您要么不在Son的实例上运行,要么您没有正确覆盖该方法。如果签名不完全相同,可能会发生这种情况。我会仔细检查你的实现,签名是完全一样的。此外,请尝试在aSon实施上方抛出@Override,看看是否收到编译错误。如果你这样做,那么你不是正确地重写该方法。

像这样

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

此外,a必须被保护或者公共的(包私有的,默认的,将只有FatherSon是在同一个包工作)。即Son必须能够“看见”a()方法。

+0

谢谢! 'a()'是'private',''protected'它工作:) – supergiox

5

无/有

  • 没有:“当我创造的儿子的一个实例,我称之为B(),父亲的一个()被调用时,”这是不对的!
  • 是的:“但是我希望它执行一个儿子(如果对象是一个儿子),可能吗?” - 这就是Java

的行为。如果a不是一个静态方法,那么Java使用dynamic binding,所以儿子的a()方法被调用。

new Son().b()将在Son中调用方法a()。这就是所谓的动态绑定。

-1

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

-1

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