在java中,匿名内部类为什么不用使用"外部类名.this",就可以调用外部类的方法?
这是一段简单的android代码
public class MainActivity extends Activity {
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button)findViewById(R.id.btn);
//此处声明一个匿名内部类
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent = new Intent(MainActivity.this,Second.class);
//在此处,startAtivity()是Activity的方法
//这么写是对的 MainActivity.this.startActivity(intent);
//为什么也可以不加MainActivity.this 这样调用?
startActivity(intent);
}
});
}
这种特性完全是一种语法糖,可以使代码更加精简。要说原因,主要是因为匿名内部类和私有内部类差不多,仅仅只在当前类中使用,所以很多事情在编译时就能确定下来。当startActivity
方法在匿名类和外部类中没有冲突时,编译器可以很容易地确定到底该调用哪个类的方法,这时候省略外部类.this
没有任何问题。
比如下面的代码
public class AnonyNestedClass {
public void foo() {}
public void bar() {
(new Object() {
public void foo() {}
public void xxx() {
foo(); // 这里调用的是匿名类的foo()方法
AnonyNestedClass.this.foo(); // 要想调用外部类的方法必须显式指定路径
}
}).xxx();
}
}
由于外部类和匿名类都定义了foo()方法,所以默认调用的是匿名类的,如果希望调用外部类的话必须要显式指定调用路径。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。