【问题标题】:Java using static method as overridden method [closed]Java使用静态方法作为重写方法[关闭]
【发布时间】:2013-06-07 12:08:42
【问题描述】:

我知道它不支持,不像 php。让我草拟我的系统。

它是一个 2D 滚动游戏,带有对象(云、星、鸟),带有一个常见的“BaseItem”类。与它们发生碰撞时可能会发生不同的事情,获得​​更多生命,失去生命......等等。抽象方法 BaseItem.eventOnCollat​​ion() 只会返回一个描述变化的数组(获得生命,失去生命,获得奖励)等)。

到目前为止还不错,但还有另一个“CloudB”,效果与“Cloud”相同。完全复制 eventOnCollat​​ion() 方法?代码重复。 Instatinize "Cloud" 并调用它的 eventOnLocation()?更好,但 instatize 加载更多,不必要的东西。我只是想知道对整理有什么影响。

那就是当我说让我们使用静态 - 它甚至不需要一个对象的实例来知道它的效果 - 可以有 100 颗具有相同效果的星星。 对象在向量中。这是我迭代所有对象的时候,并且会调用 eventOnCollat​​ion() - 异常!

我希望一切都清楚

【问题讨论】:

  • "我希望一切都清楚" => 不是真的......这种事情最好用实际代码而不是文字来解释。
  • 静态方法与覆盖无关,它们的目的完全不同。
  • 抛出了什么异常?
  • 然后想象一下 SuperMario 之类的东西 :)
  • “线程“AWT-EventQueue-0”中的异常 java.lang.IncompatibleClassChangeError:需要非静态方法 _BaseItem.effectOnCollat​​ion()”

标签: java object static overriding


【解决方案1】:

您不应该对您提到的行为使用静态方法。 您可能想要做的是让CloudB 扩展Cloud

public class CloudB extends Cloud { ... }

然后,您可以使用所有不错的东西,如覆盖方法、抽象方法等...为类似的类提供不同的行为,而无需重复代码。

【讨论】:

  • 是的。但是随后也调用了构造函数 Cloud,应该跳过它。类似 super.super 的东西 :)
【解决方案2】:

您可以让 CloudB 扩展 Cloud 并覆盖除 eventOnLocation() 之外的所有方法。 没有static这里。

【讨论】:

  • 是的。但是随后也调用了构造函数 Cloud,应该跳过它。类似 super.super 的东西 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
相关资源
最近更新 更多