为什么在方法参数中使用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关键字?