一、final 关键字
1.1 定义
final 关键字用来修饰不再发生变化的量,可以用来修饰类,属性,方法,局部变量。
1.2 使用
修饰类:final 修饰类表示该类无法被继承,表明该类已经很完善了,我们很难再对该类进行扩充。
典型应用:String,StringBuffer,System
修饰属性:final 修饰属性表示该属性一旦被初始化则无法改变,所以 final 修饰的属性要在对象的初始化完成之前完成,可以初始化的位置有显示初始化、代码块中初始化、构造器中初始化
例:
class Person {
final int age = 10; //显示初始化
final String name;
final String sex;
{
name = "xiao ming"; //代码块初始化
}
public Person() {
sex = "男"; //构造变量初始化
}
}
修饰方法:final 修饰方法表明该方法不能再被子类重写,典型的使用有 Object 类的 getClass() 方法。
修饰局部变量:可以修饰基本数据类型和引用数据类型,修饰基本数据类型表示它不可以修改值,修饰引用数据类型的变量表明它不可以修改地址值,即指向。
二、集合的域安全
2.1 定义
保证集合中的元素不可变就是域安全。
上面在提到提到了 final 修饰引用数据类型的变量,表明它不可以指向新的对象, 对于数组同样适用,但是,我们在使用数组的时候,可能不止想保证不更改数组的引用,而且也不想更改数组中的内容,这点 final 是做不到的。
例:
public class FinalTest {
private static void output(final List<Integer> arrayList) {
for(int i = 0; i < arrayList.size(); i++) {
System.out.print(arrayList.get(i) + " ");
arrayList.set(i, arrayList.get(i) + 1); //对 arrayList 中的元素更改
}
}
public static void main(String[] args) {
final List<Integer> arrayList = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5)); //定义 final 类型的 List
output(arrayList);
System.out.println();
output(arrayList);
}
}
/*结果:
1 2 3 4 5
2 3 4 5 6
*/
2.2 使用
为了保证域安全,在 C 语言中可以使用 const 关键字,在 java 中,需要使用不可变类来对集合进行包装:
public static void main(String[] args) {
final List<Integer> arrayList = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5)));
output(arrayList);
System.out.println();
output(arrayList);
}
/*结果:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableList.set(Collections.java:1311)
at static_final.FinalTest.output(FinalTest.java:9)
at static_final.FinalTest.main(FinalTest.java:15)
*/