简单也许是愚蠢的问题。我有一个登录活动,它将启动另一个活动,这是代码:

public class LoginActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.login);
    ActionBar actionBar = getActionBar();
    actionBar.hide();

    Button btnLogin = (Button) findViewById(R.id.btnLogin);
    final TextView tvUsername = (TextView) findViewById(R.id.tvUsername);
    final TextView tvPassword = (TextView) findViewById(R.id.tvPassword);

    btnLogin.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            if (tvUsername.getText().toString().length()<1) {
                Toast msg = Toast.makeText(LoginActivity.this, "Enter a Username", Toast.LENGTH_LONG);
                msg.setGravity(Gravity.TOP|Gravity.LEFT, 0, 70);
                msg.show();
                tvUsername.requestFocus();
            } else if (tvPassword.getText().toString().length()<1) {
                Toast msg = Toast.makeText(LoginActivity.this, "Enter a Password", Toast.LENGTH_LONG);
                msg.setGravity(Gravity.TOP|Gravity.LEFT, 0, 200);
                msg.show();
                tvPassword.requestFocus();
            } else {
                startActivity(new Intent(LoginActivity.this,CrewScheduleActivity.class));
                finish();
            }
        }
    });
    }
}

我的问题是关于textviews的。 Eclipse基本上说我必须使它们最终确定以便在按钮的onClick事件中使用它们。 NP,所以我做到了,而且奏效了。

问题是将它们放在@Override上方作为私有变量与放在OnCreate最终内部之间有什么区别?

最佳答案

这与closure in Java有关。基本上,当您使用匿名类时,将在其中使用的值(而不是对象本身)复制到该类中以供使用。因此,在类中返回或修改这些变量没有意义,因此它们必须是final

但是,如果变量是包含匿名类的类的一部分,则有所不同。基本上,您的内部类对LoginActivity对象(如LoginActivity.this)进行引用,并且可以使用和修改其成员和方法。

当将它们放在@Override上方时,就是使它们成为LoginActivity类的成员变量。因此,匿名类可以访问它们。

简而言之,区别在于:final变量是方法的本地变量,并复制到匿名类中;成员变量是包含类的局部变量,并由匿名类修改。

如果以后要重用匿名类中的数据,请使用成员变量。如果仅在onCreate()和匿名类中需要它,则final变量就足够了。

07-24 09:49
查看更多