Java基础java基础Java学习笔记

Java匿名内部类访问外部变量,为何需被标志为final?

2016-11-06  本文已影响1398人  Mr云台

对于Java语言中的final使用,大家应该很熟悉,可以修饰类,表示不可继承;可以修饰方法,表示不可被子类重写;可以修饰变量,表示不可以被二次赋值。那么,Java匿名内部类访问外部变量,为何需被标志为final?这跟上述三个特性有关系吗?

一、问题的提出

Java编程中,使用匿名内部类访问外部方法的局部变量是一件很常见的事件,比如以下代码,使用匿名内部类设置控件的监听器是再常见不过了,下面的例子中,因为匿名监听器类访问了外部局部变量name,编译器提示name变量必须使用final修饰。

  //初始化按钮的监听器
    public void initListener(Button btn ){
        final int name = "王大锤"; //必须标记为final

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                btn.setText(name); //动态改变按钮的文字
            }
        });
    }

为何name变量需被标志为final?这深层次的原因是什么?为什么有这样一个让人摸不着头脑的规定?

二、解释

上一篇 下一篇

猜你喜欢

热点阅读