静态的final变量是常数
一个被标记为final的变量代表它一旦被初始化之后就不会改动。也就是说类加载之后静态final变量就一直会维持原值。以Math.PI为例:
public static final double PI = 3.141592653589793;
此变量被标记为public,因此可供各方读取。
此变量被标记为static,所以你不需要Math的实例。
此变量被标记为final,因为圆周率是不变的。
此外没有别的方法可以识别变量为不变的常数(constant),但有命名习惯可以帮助你认出来。
常数变量的名称应该全部由大写字母组成!
静态final变量的初始化:
1. 声明的时候:
public class Foo {
public static final int FOO_X = 25;
}
2. 在静态初始化过程中
public class Bar {
public static final double BAR_SIGN;
static {
BAR_SIGN = (double) Math.random();
}
}
注意上面都是大写的。如果不是通过以上两种方式给该静态变量赋值的话那么在编译的时候编译器会报错。
final不只用在静态变量上
你也可以用final关键字来修饰非静态的变量,这包括了实例变量、局部变量或是方法的参数。不管哪一种,这都代表它的值不能变动。但你也可以用final来防止方法的覆盖或创建子类。
final的变量代表你不能改变它的值。
final的method代表你不能覆盖掉该method。
final的类代表你不能继承该类(也就是创建它的子类)。
非静态final变量
class Foof {
final int size = 3; //size将无法改变
final int whuffie;
Foof() {
whuffie = 42; //whuffie不能改变
}
void doStuff(final int x) {
//不能改变x
}
void doMore() {
final int z = 7; //不能改变z
}
}
final的method
class Poof {
final void calcWhuffie() {
//该方法不能被子类覆盖
}
}
final的class
final class MyMostPerfectClass {
//不能被子类继承
}