在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。final修饰变量较为常用。
当用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行初始化赋值。
【修饰变量】:
final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
【修饰方法】:
final方法不能被子类方法覆盖,但可以被继承。
【修饰类】:
final类不能被继承,没有子类,final类中所有方法都是final的。(如String类)
那么final变量和普通变量到底有何区别呢?下面请看一个例子:
public class Test { public static void main(String[] args) { String a = "hello2"; final String b = "hello"; String d = "hello"; String c = b + 2; String e = d + 2; System.out.println((a == c)); System.out.println((a == e)); } }
运行结果:
ture false
当final修饰基本数据类型或String时,如果在编译期间能够知道变量的确切值,那么编译器会把它当作编译期常量(即相当于在任何使用final变量的地方直接使用常量),不用等到运行时确定。所以变量c在便宜期间相当于"hello2"。而变量d要等到运行时通过链接确定值。不过要注意,只有在编译期间能确切知道final变量值的情况下,编译器才会进行这样的优化。
参考:http://www.cnblogs.com/hwaggLee/p/4491474.htm