Java 从超类方法调用子类方法?

Java 从超类方法调用子类方法?,java,overriding,subclass,superclass,extends,Java,Overriding,Subclass,Superclass,Extends,我的应用程序的结构与此类似: class Father{ a(){ ... } b(){a();} } class Son extends Father{ a(){ ..... }} //override b()未被重写。 当我创建一个Son实例并调用b()时,会调用父对象的a(),但我希望它执行子对象(如果对象是子对象)。可能吗 否/是 否:“当我创建一个Son实例并调用b()时,父的a()被调用,“这是错误的 是:“但是我希望它执行子1(如果对象是子的话)。可能吗?”——这是Java

我的应用程序的结构与此类似:

class Father{
a(){ ... }

b(){a();}
}

class Son extends Father{
a(){ ..... }} //override
b()未被重写。 当我创建一个Son实例并调用b()时,会调用父对象的a(),但我希望它执行子对象(如果对象是子对象)。可能吗

否/是

  • 否:“当我创建一个Son实例并调用b()时,父的a()被调用,“这是错误的
  • 是:“但是我希望它执行子1(如果对象是子的话)。可能吗?”——这是Java的行为
如果
a
不是一个静态方法,那么java使用,因此调用子的
a()
方法


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

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

应调用Son的
a
方法。如果不是,则说明您没有对
Son
的实例进行操作,或者您没有正确地重写该方法。如果签名不完全相同,则可能发生这种情况。我将在您的实现中再次检查签名是否完全相同。另外,尝试在
a
Son
实现上方抛出一个
@Override
,查看是否出现编译错误。如果您这样做,那么您没有正确地重写该方法

像这样

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

另外,
a
必须是受保护的或公共的(包私有,默认情况下,仅当
在同一个包中时才起作用)。i、 e.
Son
必须能够“看到”
a()
方法。

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

在这种情况下应该调用Son的a()。@Hovercraft,我假设OP意味着b()没有被覆盖,如果对象是a,他希望b()调用Son的a()Son@SamDeHaan:b不必重写这是一种非常常见的设计模式,son's a()假设您正确重写了a()方法,则应调用。@Hovercraft,啊,好吧,我的错。显然,我离开Java的时间比我想象的要长>>