9

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

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();
            }
        }
    });
    }
}

我的问题是关于文本视图。Eclipse 基本上说我必须使它们最终化才能在按钮的 onClick 事件中使用它们。NP所以我这样做了,它奏效了。

问题是将这些放在@Override 之上作为私有与在 OnCreate 中作为最终有什么区别?

4

2 回答 2

7

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

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

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

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

如果您想稍后重用来自匿名类的数据,请使用成员变量。如果您只需要在onCreate()匿名类中使用它,那么一个final变量就足够了。

于 2012-11-24T03:35:13.303 回答
3

当您将 TextView 字段(或与此相关的任何字段)声明为公共时,任何其他类都可以直接访问它,我认为这不是您的意图;没有理由公开 TextView 变量。
如果它被设置为私有,则可以保证它的值不会在另一个类中被覆盖,这就是final关键字最初的设计目的。因此,只需将其设置为私有,您就不必担心 Eclipse 会纠正您。
因此,总而言之:使字段私有/最终确保该值不能被另一个类覆盖,这是一个很好的设计。

希望这种漫无边际的帮助。如果没有,我会很高兴更好地澄清它。

于 2012-11-24T03:37:07.440 回答