2012-02-15 40 views
2

在我看来,当你重写方法时,你打算修改它们的用处。
但是,为什么在超类中引用相同的方法(以它最初写入的方式),如果它不像我那样感兴趣?也就是说,修改方法,然后以原始方式调用相同的方法,在我看来,第一个更改被第二个更改取消。我错在哪里?@Override and Super

回答

2

你不一定调用.super()为了调用派生你的类的超类中的方法。然而,你经常这样做,因为你在重写方法中做的东西应该被加上来完成超类方法执行的东西。无论您是否执行此操作取决于相关代码的设计。

某些Android API方法绝对要求您在覆盖它们时调用.super(),因为有一些重要的东西是超类的方法最重要的,即使派生类重写了该方法。如果您在覆盖Android API方法时必须致电.super(),文档通常会这样说。如果你不这样做,你可能会得到一个异常,特别是在执行代码时告诉你不这样做。

+0

我只是想知道,相应的类如何检查超级被调用 - 如果它不是抛出异常? – Force 2012-02-15 11:05:16

+0

我想这样做的一种方法可能与实现在超类的方法(派生类可以重写)中设置的标志'boolean'一样简单,并在另一个方法中轮询该标志,并在未设置时抛出异常。例如,通过这种方式,您可以检测是否调用了“doSomeStuff()”,而未调用基类“initialiseStuffFirst()”。 – Trevor 2012-02-15 11:11:28

+0

android'Activity'类有一些方法示例,如果您覆盖它们,您必须调用'.super()' - 可能值得查看Grepcode上的源代码以查看它们如何检测它。 – Trevor 2012-02-15 11:13:28

4

除了Trevor之外,大多数需要你调用super()的方法意味着你正在重写的方法对于流程生命周期的顺利进行是必要的(如在Activity的onCreate,onPause等)。如果你未能在这些方法上返回超级,android会抱怨。另一方面,调用super的其他重写方法(在扩展Android类(例如View)时可以看到它们)实际上会返回某些内容(很可能是true或false) - 如某些return super.methodName(args); - 根据情况而定,你可以重写这些,直到你可以手动返回一个值并跳过超级通话。

+0

非常好的解释。 – 2012-02-15 11:56:35