为什么在方法参数中使用Final
当我编写android时,我遇到了以下事情
@Override public View getView(final int position, View convertView, ViewGroup parent) { convertView = _inflater.inflate(R.layout.abstract_list_row_item, null); move.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // if btn is clcked then data is changed an we need to refresh framents MainAppDataController.getInstance().setIsDataChanged(true); callWhiteListDB = new CallWhiteListDB(_context); callWhiteListDB.openToWrite(); callWhiteListDB.insert(allContacts.get(position).name, allContacts.get(position).number); callWhiteListDB.close(); callBlackListDB = new CallBlackListDB(_context); callBlackListDB.openToWrite(); callBlackListDB.deleteSingleItem(allContacts.get(position).dbId); callBlackListDB.close(); populateList(position); notifyListView(view); } }); return convertView;
在上面的例子中, getView()
方法有像int position,View convertView,ViewGroup parent这样的参数。我只是在onclick()
开始使用位置变量后,Eclipse会抛出编译错误并要求将位置作为final。 我为什么要把它作为最后的? AFAIK final用于常量。
final
用于方法参数,以使引用在传递给方法后不可更改 。 这是保护传递参数的专门方法。 因此,接收方法将无法使用新对象或值重新初始化它
您在匿名内部类中使用position
。 因此,要求该职位是最终的。
匿名类无法访问其封闭范围中未声明为final
或者final final的局部变量。
最终修饰符表示此字段的值不能更改。
http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html
我们将final
关键字与方法参数一起使用,以防止方法内的代码修改该参数的值。
final使你的变量保持不变。
因为你的onclick方法将在这个函数结束后调用,你的变量不再存在,所以当你使用一个final变量时,它的常量值会在onclick中传递。
这是因为当你的listView
膨胀布局时会调用getView
…当你的view (move)
被按下时会调用onClick
…当它的onClick被触发时, getView
的变量position
已经被破坏了……最后确保保持position
的值以供以后使用
-
可以使用关键字final声明java变量。 然后最终变量只能分配一次。
-
声明为final且未初始化的变量称为空白最终变量。 空白的最终变量强制构造函数初始化它。
-
声明为final的Java类无法扩展。 限制inheritance!
-
声明为final的方法不能被覆盖。 在方法中,private等于final,但在变量中则不是final。
-
最终参数 – 初始化后无法更改参数值。 做一个小的java练习,找出方法覆盖中最终参数的含义。
-
Java本地类只能引用声明为final的局部变量和参数。
- 将java变量声明为静态final的明显优势是,编译的java类可以提高性能。
有关更多信息,请阅读本文
另请参见在Java方法性能中使用final关键字?