final关键字主要用在三个地方:变量、方法、类。
- 对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的 变量,则在对其初始化之后便不能再让其指向另一个对象。
- 当用final修饰一个类时,表明这个类不能被继承。final类中的所有成员方法都会被隐式地指定为final方法。
- 使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。 在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的 任何性能提升(现在的Java版本已经不需要使用final方法进行这些优化了)。类中所有的private方法都隐式地 指定为fianl。
那么final变量和普通变量到底有何区别呢?举个例子说明一下:
public class FinalTest {
public static void main(String[] args) {
String a = "HelloWorld!";
final String b = "HelloWorld";
String c = "HelloWorld";
String d = b + "!";
String e = c + "!";
System.out.println("输出结果:");
System.out.println("a:"+a);
System.out.println("b:"+b);
System.out.println("c:"+c);
System.out.println("d:"+d);
System.out.println("e:"+e);
System.out.println(("a=d?"+(a == d)));
System.out.println(("a=e?"+(a == e)));
}
}
输出结果:
a:HelloWorld!
b:HelloWorld
c:HelloWorld
d:HelloWorld!
e:HelloWorld!
a=d?true
a=e?false
在上面的一段代码中,由于变量b被final修饰,因此会被当做编译器常量,所以在使用到b的地方会直接将变量b 替换为它的值。而对于变量c的访问却需要在运行时通过链接来进行。想必其中的区别大家应该明白了,不过要注意,只有在编译期间能确切知道final变量值的情况下,编译器才会进行这样的优化。