我们可以看看下面一个类顶部的声明:
static int intVal = 42; static String strVal = "Hello, world!";
当一个类第一次使用时,编译器会调用一个类初始化方法——<clinit>
,这个方法将42存入变量intVal
,并且为strVal
在类文件字符串常量表中提取一个引用,当这些值在后面引用时,就会直接属性调用。
我们可以用关键字“final”来改进代码:
static final int intVal = 42; static final String strVal = "Hello, world!";
这个类将不会调用es a <clinit>
方法,因为这些常量直接写入了类文件静态属性初始化中,这个初始化直接由虚拟机来处理。代码访问intVal
将会使用Integer类型的42,访问strVal
将使用相对节省的“字符串常量”来替代一个属性调用。
将一个类或者方法声明为“final”并不会带来任何的执行上的好处,它能够进行一定的最优化处理。例如,如果编译器知道一个Get方法不能被子类重载,那么它就把该函数设置成Inline。
同时,你也可以把本地变量声明为final变量。但是,这毫无意义。作为一个本地变量,使用final只能使代码更加清晰(或者你不得不用,在匿名访问内联类时)。