下面将会讨论可以用到 final 的三种情况:数据、方法、类
1. 数据
1).final修饰的数据成员
原始数据类型:即表示为常量,值不可改变。
引用数据类型:引用不可改变,但引用自身却可修改;final修饰数组时,数组的元素可以修改。
2). 初始化:
实例变量:执行构造方法前初始化(即使用前被初始化)
类变量:声明时初始化
class t3{
public final int a1; //实例变量声明,即为 空白final
public static final int a2 = 5; //类变量声明时初始化
public t3() {
a1 = 5; //初始化
}
}
3).编译时常量:
原始数据成员+final修饰+定义时赋值 ;
在编译的时候就被计算执行,并带入到程序中一切可能用到它的计算式中进行替换。
2.方法
1). 该方法不能被覆盖。
2). 每个 private 方法都隐式指定为 final,但由于无法访问,也就无法覆盖。
下面来一段有趣的代码
public class t1 extends t2{
private final void f1() {
System.out.println("f1 ");
}
public final void f2() { //不能被覆盖
System.out.println("f1 ");
}
}
class t2{
private final void f1() {
System.out.println("f1 ");
}
// public final void f2() {
// System.out.println("f1 ");
// }
}
由于方法用 private 修饰也就无法访问,子类也就没有覆盖该方法(仅可理解为生成了一个新方法)。
3.类
无法被继承
final类中所有方法都隐式指定为 final ; 但数据成员不是 final !