Android Eclipse Plugin中的super()调用的位置生成的代码可靠吗?

在许多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); } 

我不明白什么超类在每种情况下做,所以我总是插入我的代码在TODO标签的确切位置。 在这个例子中,我将在构造函数中的代码之前和在onDraw()中的代码之后调用super()。

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

Solutions Collecting From Web of "Android Eclipse Plugin中的super()调用的位置生成的代码可靠吗?"

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

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

如果文档没有提供足够的信息,则必须查看源代码。 Android代码可以在这里find (姜饼版)。 API代码是core

编辑代码不再可用在git.kernel.org。 以下是另外两个可以浏览代码的地方:

  • github.com
  • omapzoom.org

主代码位于平台>框架>基础库中

我可以在生成的代码中始终依赖这些代码插入位置吗?

不,有时你不想打电话给super.method 。 有时候你想先打个电话,有时候打在最后一个地方等等。 但是,我正在谈论的方法,没有构造函数。

什么时候调用super()有一个简单的规则/解释?

你将永远不得不像以前的答案点一样super 。 你不调用super的唯一情况是超类的构造函数没有参数; 在这种情况下编译器会把你的super

我不明白什么超类在每种情况下做什么,所以我总是插入我的代码的确切位置的/ / TODO标签

如果您有疑问(我正在谈论超级方法),您可以随时查看源代码。 谷歌代码search是一个很好的资源。 那么你可以决定是否把你的代码之前或之后的超级方法; 甚至根本不要放超级方法。

请记住,不要把超级方法在编译时有效。 但是,除非调用super方法(例如Activity类的onResume方法),否则android上的某些方法将不起作用。

另外,有时你会决定是否在运行时运行超级方法。 考虑这个经典的例子:

 @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if( KeyEvent.KEYCODE_BACK == event.getKeyCode() ){ return true; } return super.onKeyUp(keyCode, event); } 

如果用户按下后退键,则不会调用超级方法。 如果用户没有,你把工作委托给super方法。

“如果一个构造函数没有明确地调用超类的构造函数,那么Java编译器会自动插入一个对超类的无参构造函数的调用,如果超类没有无参构造函数,那么会得到一个编译时错误。对象确实有这样的构造函数,所以如果Object是唯一的超类,那就没有问题了。

检查非构造函数覆盖的文档。 有时你想打电话给超级,有时候不会。