一个简单的java匿名内部类,如何引用外面类的成员?-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

一个简单的java匿名内部类,如何引用外面类的成员?

西秦说云 2016-02-08 23:10:00 2483

在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);
            }
        });
    }
云服务器登录 云服务器设置
分享到
取消 提交回答
全部回答(1)
  • 西秦说云
    2019-07-17 18:28:24
    已采纳

    这种特性完全是一种语法糖,可以使代码更加精简。要说原因,主要是因为匿名内部类和私有内部类差不多,仅仅只在当前类中使用,所以很多事情在编译时就能确定下来。当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()方法,所以默认调用的是匿名类的,如果希望调用外部类的话必须要显式指定调用路径。

    0 0
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

相似问题
最新问题