【问题标题】:This and super keyword usage in androidandroid 中 this 和 super 关键字的使用
【发布时间】:2016-10-29 19:59:53
【问题描述】:

我是 android 和 java 的新手,我无法理解为什么在 android 中有时使用“this”关键字而不是“super”?

还有如何在没有“this”或“super”关键字的情况下调用父方法。

例如,假设我们有

public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

public void sendMessage(View view) {
    Intent intent = new Intent(this, DisplayMessageActivity.class);
    EditText editText = (EditText) findViewById(R.id.edit_message);
    String message = editText.getText().toString();
    intent.putExtra(EXTRA_MESSAGE, message);
    this.startActivity(intent);
}

我们可以看到在上面的例子中 MainActivety 类没有 setContentView 方法实际上这个方法是在 ActionBarActivity 中定义的

public void setContentView(int layoutResID) {
    this.getDelegate().setContentView(layoutResID);
}

那么我们如何在没有“this”或“super”的情况下调用它?

尽管方法是在父类中定义的,但为什么我们将“this”放在前面仍然有效,而不是“this”关键字用于当前范围/类。

【问题讨论】:

标签: java android inheritance


【解决方案1】:

没有“this”或“super”关键字如何调用父方法?

如果你调用的方法没有在“当前”类中重新定义,你可以不用super,如果它被重新定义,你可能需要消除调用的歧义:

class A {
  public void f() {}
  public void h() {} 
  public void i() {} 
}

class B extends A {
  public void g() { f(); } // same as super.f()
  public void h() { h(); /* recursive call */ }
  public void i() { super.i(); /* call to inherited but "masked" */ }
}

没有“this”或“super”我们怎么称呼它?

this不是强制的,当你在实例方法中写something时,读为this.something。这就是为什么在前面的示例中,调用 h() 是一个递归调用。

this 没有作用域,它表示“完整”对象本身。 super 涵盖以下内容。 this 是当前类的类型,super 是作为其父类类型的对象。

【讨论】:

    【解决方案2】:

    在 Java 中,您不必在每次想要访问派生类父类中的字段或调用方法时都显式添加this。扩展一个类基本上意味着继承父类的所有属性,同时创建一个全新的类型。 this 关键字是指通过MyClass instance = new MyClass() 实例化时创建的实例,而不是MyClass 定义。如果要在类范围内设置变量,可以使用static field

    但是,当您定义了一个局部变量时,假设作为方法的参数 (void method(String startActivity){}),那么该局部定义将覆盖对 this 中定义的访问,因此需要显式的 this 关键字.

    对于 super 调用,当您在 Java 中重写一个方法时,您可以使用 super.<the method name>() 调用您已重写的原始方法。这是必需的,因为在类中不再有原始方法的概念。

    【讨论】:

      猜你喜欢
      • 2011-04-30
      • 1970-01-01
      • 1970-01-01
      • 2018-09-19
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多