Java Android Final vs Private文本视图
简单的也许是愚蠢的问题。我有一个登录活动,它会启动另一个活动,下面是代码:Java Android Final vs Private文本视图,java,android,final,Java,Android,Final,简单的也许是愚蠢的问题。我有一个登录活动,它会启动另一个活动,下面是代码: public class LoginActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.login); ActionBar actionBar = get
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();
}
}
});
}
}
公共类LoginActivity扩展活动{
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
ActionBar ActionBar=getActionBar();
actionBar.hide();
按钮btnLogin=(按钮)findViewById(R.id.btnLogin);
最终文本视图tvUsername=(文本视图)findViewById(R.id.tvUsername);
最终文本视图tvPassword=(文本视图)findViewById(R.id.tvPassword);
btnLogin.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(tvUsername.getText().toString().length()这与此有关。基本上,当您使用匿名类时,其中使用的值(而不是对象本身)会复制到该类以供使用。因此,在类中返回或修改这些变量没有意义,因此它们必须是final
但是,如果变量是包含匿名类的类的一部分,那就不同了。基本上,您的内部类引用了LoginActivity
对象(作为LoginActivity.this
),并且可以使用和修改其成员和方法
当你把它们放在@Override之上时,你使它们成为LoginActivity
类的成员变量。因此,它们可以被匿名类访问
简而言之,区别在于:final
变量是方法的局部变量,并复制到匿名类;成员变量是包含类的局部变量,并由匿名类修改
如果以后要重用匿名类中的数据,请使用成员变量。如果只在onCreate()
和匿名类中需要它,则在声明TextView字段(或与此相关的任何字段)时,一个final
变量就足够了。作为public,它可以被任何其他类直接访问,我认为这不是您的意图;没有理由将TextView变量公开。
如果将它设置为private,则可以保证它的值不会在另一个类中被重写,这就是final关键字最初的设计目的。因此,只需将它设置为private,您就不必担心Eclipse会纠正您的错误。
总之,将字段设为private/final可以确保该值不能从另一个类重写,这是一个很好的设计。
希望这篇漫无边际的文章能有所帮助。如果没有,我会很高兴更好地澄清它。好的,我现在明白了。我完全没有意识到公共void onClick(视图五)HeHe是另一个班里的一个匿名类。我想我现在将把它们保存到最后。下一步是使用登录到WCF Web服务的值,如果我需要它们作为私有的话,我会这样做。没问题;我们很乐意帮助;如果答案是有用的,考虑一下也要投票。谢谢。不是匿名类;它是匿名类中的一个重写方法。谢谢,我想它说需要15个声誉,我们必须弄清楚这个代表的东西。也经常来这里帮助回答其他人的问题;这真的有助于你的声誉,以及你的知识。尽可能查看。要添加一些内容,封闭块中声明的最终字段保证完全构造并对其他线程可见。好的,还有一件事有点让人困惑。我只是想看看我是否正确理解了这一点。1.LoginActivity由于extends关键字而从Activity类继承。2.public Void OnCreate覆盖了on创建活动类的方法。3.公共的void OnClick重写?我有点搞不懂为什么会有重写,因为我像这里的VBA一样思考,OnClick不需要重写任何东西。它实现了一个OnClickListener
。如果你看看OnClickListener
类,你会注意到有一个OnClick代码>方法;您正在重写它,即使它不是一个显式声明的实现
类。是的,您的其他观点是正确的。哦,该死的,我没有意识到OnClickListener是一个类,啊,有很多阅读要做。再次感谢