我是android和java的新手,我无法理解为什么在android“this”关键字有时会使用而不是“超级”?
另外,如何在没有“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”关键字意味着当前范围/类。
答案 0 :(得分:1)
如果没有"这个"如何调用父方法?或"超级"关键字?
如果没有super
您可以在"当前"中重新定义您调用的方法,则可以class,如果重新定义,则可能需要消除呼叫的歧义:
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
不是必需的,当您在实例方法中编写something
时,它将被读取为this.something
。这就是为什么在前面的例子中,调用h()
是一个递归的。
this
没有范围,它表示"完整"对象本身。 super
范围如下。使用当前类输入this
,super
是作为其父类输入的对象。
答案 1 :(得分:0)
在Java中,您不必在每次要访问字段时显式添加this
,也不必在派生类或父类中调用方法。扩展类基本上意味着继承父类的所有属性,同时创建一个全新的类型。 this
关键字是指通过MyClass instance = new MyClass()
实例化时创建的实例,而不是MyClass
定义。如果要在类范围上设置变量,可以使用static field。
但是,如果定义了局部变量,可以说作为方法(void method(String startActivity){}
)的参数,那么该本地定义将覆盖对this
中定义的访问,因此需要明确this
关键字。
对于超级调用,当您在Java中覆盖方法时,可以使用super.<the method name>()
调用已覆盖的原始方法。这是必要的,因为在课堂上不再有原始方法的概念。