final关键字

一.要点

1.final关键字可以用于成员变量、本地变量、方法以及类。
2.final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误。
3.你不能够对final变量再次赋值。
4.本地变量必须在声明时赋值。
5.在匿名类中所有变量都必须是final变量。
6.final方法不能被重写。
7.final类不能被继承。
8.final关键字不同于finally关键字,后者用于异常处理。
9.final关键字容易与finalize()方法搞混,后者是在Object类中定义的方法,是在垃圾回收之前被JVM调用的方法。
10.接口中声明的所有变量本身是final的。
11.final和abstract这两个关键字是反相关的,final类就不可能是abstract的。
12.final方法在编译阶段绑定,称为静态绑定(static binding)。
13.没有在声明时初始化final变量的称为空白final变量(blank final variable),它们必须在构造器中初始化,或者调用this()初始化。不这么做的话,编译器会报错“final变量(变量名)需要进行初始化”。
14.将类、方法、变量声明为final能够提高性能,这样JVM就有机会进行估计,然后优化。
15.按照Java代码惯例,final变量就是常量,而且通常常量名要大写。

二.常量的存放

常量池分为方法区中的运行时常量池和class文件中的常量池,class文件中的常量池在编译时确定,其中包括符号引用和字面量(文本字符串,被声明为final的变量的值),运行时,JVM从中读取数据到方法区的运行时常量池,运行时常量池可以在运行时添加常量,常量可以在运行时或编译时被放入常量池,编译期放入到类文件的常量池中,运行时放入到方法区的运行时常量池中,JDK1.7后运行时常量池位于堆中,访问类中的常量不一定会加载类。

三.intern方法

intern方法的作用如下:
1、若m的字符串值在常量池中,则返回m的引用。
2、若m的字符串值不在常量池中(在堆内存中),但常量池中含有该字符串值,则返回常量池中该字符串值的引用。
3、若m的字符串值不在常量池中(在堆内存中),且常量池中不含有该字符串值,则在常量池中创建一个与m的字符序列相同的字符串值,然后返回新创建字符串值的引用。

你可能感兴趣的:(final关键字)