获取错误"不能引用在不同方法中定义的内部类中的非final变量"

时间:2014-11-18 19:34:41

标签: java android

我是Java和Android编程的新手。我得到了这段代码的错误:

public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    TextView tView=(TextView) findViewById(R.id.txt);
    Button btn=(Button) findViewById(R.id.button);
    btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            tView.setText("Blah Blah");     
        }
    });

但是当我宣布参考类型" tView"在onCreate()方法之外,只是错误就消失了,那么代码将是这样的:

public class MainActivity extends ActionBarActivity {

TextView tView;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tView=(TextView) findViewById(R.id.txt);
    Button btn=(Button) findViewById(R.id.button);
    btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            tView.setText("Blah Blah");     
        }
    });

那么当我宣布参考类型" tview&#34时,区别是什么?在方法onCreate()内部吗?

2 个答案:

答案 0 :(得分:0)

这与变量的范围有关。在方法内定义变量时,变量范围仅在该方法内。创建onClickListener时,您将创建一个匿名内部类。这意味着你必须这样做才能使代码工作:

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final TextView tView=(TextView) findViewById(R.id.txt);
        Button btn=(Button) findViewById(R.id.button);
        btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                tView.setText("Blah Blah");     
            }
        });

这可以防止tView变量发生变化。

当您以另一种方式编码时,范围会更改,并且整个类都会看到变量,而不仅仅是方法。

答案 1 :(得分:-1)

我搜索了一下,我得到的是当我们在内部类中使用非最终局部变量时,当内部类尝试更改不存在的局部变量时,可能会导致一些意外和奇怪的问题方法结束后。