【问题标题】:Call subclass method from a superclass method?从超类方法调用子类方法?
【发布时间】:2011-10-24 08:56:19
【问题描述】:

我的应用具有类似这样的结构:

class Father{
a(){ ... }

b(){a();}
}

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

b() 未被覆盖。 当我创建 Son 的实例并调用 b() 时,会调用父亲的 a(),但我希望它执行 Son 的实例(如果对象是 Son)。可能吗?

【问题讨论】:

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

标签: java overriding subclass superclass extends


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    否/是

    • 否:“当我创建 Son 的实例并调用 b() 时,会调用父亲的 a(),”这是错误的!
    • 是的:“但我希望它执行 Son one(如果对象是 Son)。这可能吗?” -- 这就是Java的行为

    如果a不是静态方法,那么java使用dynamic binding,所以调用了儿子的a()方法。

    new Son().b() 将调用 Son 中的方法 a()。这称为动态绑定。

    【讨论】:

      【解决方案3】:

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

      这样

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

      此外,a 必须是受保护的或公共的(默认情况下,私有包仅在 FatherSon 位于同一包中时才有效)。即Son 必须能够“看到”a() 方法。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2012-04-18
          • 1970-01-01
          • 2011-11-22
          • 2013-03-22
          • 2011-12-08
          相关资源
          最近更新 更多