final关键字的使用
1.修饰类
表明这个类不能被继承,类中所有成员方法都会被隐式地指定为final方法,比如:String类,Integer及其他包装类
2.修饰方法
表明该方法不能被子类重写
3.修饰变量
如果final修饰基本数据类型的变量,其数值一旦初始化后不能被修改。
如果final修饰引用类型的变量,初始化后不能再让其指向另一个对象,但引用类型变量指向的对象的内容是可变的。
例如:
class Person {
public int age = 0
}
final Person person = new Person();
person.age = 20; // 引用变量的内容是可变的
如果final修饰成员变量时,成员变量必须在定义时或者构造器中进行初始化赋值,初始化赋值后不能被修改。
如果final修饰本地变量(方法中或代码块中的变量为本地变量)时,本地变量必须在声明时赋值,初始化赋值后不能被修改。
final关键字的优点
-
final关键字提高了性能,JVM和Java应用都会缓存final变量
-
final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。
-
使用final关键字,JVM会对方法、变量及类进行优化。
例如:
final String name = "Tom";编译器在编译期间知道确切值,把它当做编译器常量使用,即在用到该final变量的地方,相当于直接访问这个常量,不需要在运行时确定。
final String name = getName();编译器在编译期间不知道确切值,就不会做优化处理。
final关键字的注意点
-
接口中声明的所有变量本身都是final的。
-
在匿名类中所有变量都必须是final变量。
-
final和abstract这两个关键字是反相关的,final类不可能是abstract的
-
对于集合对象声明为final,其引用不能被更改,但是可以向其中增加、删除或改变内容。
例如:
private final List<Person> persons = new ArrayList<Person>(); persons.add("Tom"); persons.add("Jack"); //persons = new Vector(); --- 引用不能被更改 -
将类、方法、变量声明为final能够提高性能、这样JVM就有机会进行估计,然后优化。
-
static修饰成员变量表示只保存一份副本,final修饰成员变量用来保证变量不可变。
-
final方法在编译阶段绑定,称为静态绑定。