- final修饰的成员变量一旦有了初始值,就不能被重新赋值,而且必须由程序员显示地指定初始值。
- final修饰的引用类型变量也不能被重新赋值,但可以改变引用类型变量锁引用对象的内容,例如:
public static void main(String[] args) {
final int[] iArr = {5, 6, 12, 9};
// 对数组元素进行排序,合法
Arrays.sort(iArr);
// 对数组或者数组元素赋值,非法
iArr[2] = 8;
iArr = null
final Person p = new Person(45);
// 改变age实例变量,合法
p.setAge(23);
// 对p重新赋值,非法
p = null;
}
对于一个final变量,只要满足三个条件,这个final就相当于一个直接量:
1. 使用final修饰符修饰
2. 在定义该final变量时指定了初始值
3. 该初始值可以在编译时就被确定下来
public static void main(String[] args) {
// 下面定义了4个final“宏变量”
final int a = 5 + 2;
final double b = 1.2 / 3;
final String str = "疯狂" + "Java";
final String book = "疯狂Java讲义:" + 99.0;
// 下面的book2变量的值因为调用了方法,所以无法在编译时被确定下来
final String book2 = "疯狂Java讲义:" + String.valueOf(99.0);
System.out.println(book == "疯狂Java讲义:99.0");// true
System.out.println(book2 == "疯狂Java讲义:99.0");// false
}
- final修饰的方法不可被重写。
- final修饰的类不可以有子类。