我怎么知道何时/何地调用超类的重写方法

时间:2010-04-14 11:27:55

标签: java android

编写Android应用程序时遇到了这个问题, 但它似乎是一个更普遍的编程问题。

情况是,我正在从库中扩展(子类化)一个类,并覆盖一个方法。我怎么知道我是否应该调用超类的方法?什么时候? (在重写方法的开头或最后?)

例如,我在Android平台的类“Activity”中覆盖了“public boolean onCreateOptionsMenu(Menu menu)”方法。在一个例子中,我看到有人在方法的最后写了“return super.onCreateOptionsMenu(menu)”。但我怎么知道它应该这样做?这是对还是不对?如果我用“super.onCreateOptionsMenu(menu)”开始我的方法有什么区别?

BR, 亨利

6 个答案:

答案 0 :(得分:7)

我认为你不能在摘要中回答这个问题:它取决于你所覆盖的超类方法的行为。

根据具体情况,可能适合:

  • 首先打电话
  • 最后致电
  • 自己处理一些情况(自定义),为其余部分调用super
  • 从不打电话给超级

希望您覆盖的特定班级的文档会告诉您是否/何时需要拨打超级电话。

答案 1 :(得分:1)

不幸的是,没有这方面的规则。如果文档说你需要,你需要参考API文档并调用super。

关于你是否可能需要或不需要Android的一个提示是你所覆盖的方法是否是生命周期方法之一。在这种情况下,您可以确定您需要调用super。

答案 2 :(得分:1)

这些是有效的问题,但不幸的是,这里没有一般规则。

是否需要调用super方法取决于super方法是否需要执行某些操作。换句话说:您是在扩展还是替换被覆盖的方法?一个好的API文档应该给你答案。此外,图书馆通常遵循一些惯例来明确如何使用它们。

放置超级电话的问题的答案取决于您何时执行扩展。是否需要在超级方法之前或之后运行?大多数情况下,你首先打电话给超级,然后做额外的事但是如果你需要为super方法准备一些东西,例如修改一些对象状态或操纵参数,你可以在超级调用之前放置代码。同样,API文档应该在这里给出答案。

答案 3 :(得分:1)

如果您忘记拨打超级电话,Android会在大多数情况下导致异常。 如果你不这样做,我会相信你不必打电话给超级而且它不会扔掉。

在谷歌小组讨论中,生命周期方法的一些最佳实践得到了发展(它们没有正式的数据支持,但被许多程序员使用):

  • 如果您使用的是创建方法 onCreate,onResume等等 作为第一个声明。因此,您可以确保必须从超类中准备好所有内容。
  • 如果您使用的是onSaveInstanceState等关闭方法,则onPause会调用super last。现在,您可以确保在完成所有操作之前不会删除任何内容或将其更改为错误状态。

答案 4 :(得分:0)

您不需要调用super.method(),只有在您需要它时才需要它。

答案 5 :(得分:-1)

当您覆盖子类中的方法时,它取决于您调用该方法的实例的类型。

例如:

   Class Animal{
        public eat(){
           //..
        }
   }

   Class Dog extends Animal{
        public eat(){
           //..
        }
  }

now if you say new Dog().eat() 
it executes Dog's eat method.

if you say new Animal().eat()
it executes Animal's eat method.

你可能有这样的代码

       Animal a = new Dog();
       a.eat();

再次执行Dog's eat方法,因为实际的实例是Dog。