Android Eclipse插件中super()调用的位置生成的代码是否可靠?

rgr*_*_mt 16 eclipse android super adt

在许多Android方法中,尤其是构造函数和重写方法,您应该甚至必须使用super()调用父类方法.当您使用Eclipse Source> Override/Implement Methods ...时,您可以从包含TODO标签的模板中获取代码,如下所示:

public MyCanvas(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
}


@Override
protected void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub      
    super.onDraw(canvas);
} 
Run Code Online (Sandbox Code Playgroud)

我不太了解超类在每种情况下的作用,所以我总是在// TODO标签的确切位置插入我的代码.在这个例子中,我会在构造函数中的代码之前和onDraw()中的代码之后调用super().

我是否可以始终在生成的代码中依赖这些代码插入位置?调用super()时是否有简单的规则/解释?

Ted*_*opp 14

这是一个很好的问题.不幸的是,没有简单的规则.您需要知道超类实现的作用.有时(如View.onDraw()),超类实现什么都不做; 调用super()既无害又无需.在其他情况下(例如Activity.onCreate()),超类实现执行必须在子类处理中的某个点执行的关键操作.有时当你调用super()时会发生在子类中的任何处理之前,有时在其他点.有时你想用自己的方法完全替换超类处理,在这种情况下你根本不调用super().您可以完全自由地在子类的逻辑中的任何位置(甚至在多个点)调用超类版本.

在构造函数中,对超类构造函数(如果存在)的调用必须是方法中的第一件事.如果没有,编译器会自动插入对超类中无参数构造函数的调用.(如果超类没有无参数构造函数,或者子类无法访问它,则编译器会生成错误.)

如果文档没有提供足够的信息,那么您必须查看源代码.Android的代码可以在这里(姜饼版本).API代码在core.

编辑 git.kernel.org上不再提供该代码.以下是您可以浏览代码的其他两个地方:

主要代码位于存储库Platform> Frameworks> Base中