简单或许愚蠢的问题。我有一个启动另一个活动的登录活动,这里是代码:
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作为私有vs在OnCreate内部作为最终版本之间有什么区别?
答案 0 :(得分:7)
这与closure in Java有关。基本上,当您使用匿名类时,其中使用的值(不是对象本身)将被复制到该类以供使用。因此,在类中返回或修改这些变量没有意义,因此它们必须是final
。
但是,如果变量是包含匿名类的类的一部分,那就不同了。基本上,您的内部类具有对LoginActivity
对象的引用(如LoginActivity.this
),并且可以使用和修改其成员和方法。
当你把它们放在@ Override&#34;之上时,你就会把它们作为LoginActivity
类的成员变量。因此,匿名类可以访问它们。
简洁来说,不同之处在于:final
变量是方法的本地变量,并复制到匿名类;成员变量是包含类的本地变量,并由匿名类修改。
如果您想稍后重用匿名类中的数据,请使用成员变量。如果您只需要onCreate()
和匿名类,那么final
变量就足够了。
答案 1 :(得分:3)
当您将TextView字段(或任何字段)声明为公开时,可以由任何其他类直接访问,我不相信这是您的意图;没有理由将TextView变量公开。
如果将其设置为私有,则可以保证其值不会在另一个类中被覆盖,这就是 final 关键字首先设计用于执行的操作。因此,只需将其设置为私有,您就不必担心Eclipse会纠正您。
因此,总结一下:使字段private / final确保不能从另一个类重写该值,这是一个很好的设计。
希望这漫无边际的帮助。如果它没有,我会很高兴澄清它。