深入理解 final 关键字

时间:2021-11-03 17:03:17

对于基本类型:

如 final int i=1;

final 的作用就是保证一个常量(编译期进行编译),一旦声明就不允许进行任何改变。而且在声明时就必须要确定它的值(或者按初始化置ZERO)。


对于对象类型:

如 final List i=new ArrayList()等等

final 的作用是保证 对象的引用不可改变( 此处的引用为i),也就是说,i 这个引用只能一次性的指向 new ArrayList()这个对象,一次性的定义后,不允许二次改变。(Once the reference is initialized to an object, it can never be changed to point to another object.)。然而这个对象本身可以改变!

比如 final List i=new ArrayList();

// ! i=new ArrayList();    不允许改变引用

//! i=new LinkedList();  不允许改变引用

//可以改变这个对象。

i.add(1);

i.remove(...);



所以,使用final首先要知道这两点。如果你一定要让一个对象类型的实例不可改变,可以通过别的方式来完成 。如List :

class ListReturn {
List list = new ArrayList();


private void doSomething() {
list.add("1");
list.add("2");
}

//返回的list不允许任何改变,也就是只有 1,2 这两个元素。
public List getList() {
doSomething();
return Collections.unmodifiableList(list);
}

}