final是什么?
final 是一个修饰符。
final使用场景?(即如何使用)
final 变量、方法、类
final修饰类
该类是最终类,不能被继承,例如jdk包的String、System,final类中的所有成员方法都会被隐式地指定为final方法
final修饰方法
该方法不能被子类覆盖(重写),类的private方法会隐式地指定为final方法
final修饰变量(成员变量、局部变量)
修饰成员变量时,必须在定义时或构造函数中进行初始化赋值,且一旦被赋值后,不能再被赋值了;
修饰局部变量,只需保证在使用之前被初始化赋值即可。
变量为基本数据类型时,则其值一旦在初始化后便不能修改,若为引用类型,则其初始化后不能再指向其它对象,但其值可以变化。
final关键字的好处?
使用final关键字,JVM会对方法、变量及类进行优化。
final关键字提高了性能。JVM和Java应用都会缓存final变量。
final修饰的变量和普通变量的区别?
当final修饰的变量是基本数据或者String类型时,如果在编译期间能知道它的值,则编译器会把它当做编译期常量使用,即相当于直接访问这个常量,不需在运行时确定。代码如下:
public class Test{
public static void main(String[] args){
final String str = "hello";
String m = "hello";
String n = "hello2";
String a = str +2;
String b = m +2;
System.err.println(n==a);
System.err.println(n==b);
}
}
输出: ture false
final、static、static final修饰的字段赋值的区别?
(1)final修饰的变量在运行时被初始化(可直接赋值,也可在构造器中赋值),只能被赋值一次,不能修改。
(2)static修饰的变量在类加载过程中的准备阶段被初始化为0或null,而后在初始化阶段(触发构造器)才会被赋予代码中设定的值。若没有,则为默认值。
(3)static final修饰的变量
在Javac时生成ConstantValue属性,在类加载的准备阶段根据
ConstantValue的值为该字段赋值,它没有默认 值,必须显式地赋值,否则Javac时会报错。
可以理解为在编译期即把结果放入了常量池中。