final 关键字
基本介绍
final 可以修饰类、属性、方法和局部变量(final 不能修饰构造器)
(1)修饰属性时:表示该属性不能被修改
(2)修改方法时:表示该方法不能被重写
(3)修改类时:表示该方法不能被继承
使用场景
(1)类不能被继承时,可以使用 final 修饰
(2)类的某个属性不可以被更改,可以使用 final 修饰
(3)父类的某个方法不能被子类重写,可以使用 final 修饰
(4)某个局部变量不能被修改,可以使用 final 修饰
1. 可以是循环中的局部变量
2. 可以是方法中的局部变量
使用细节
(1)final 修饰的属性又叫常量(全部大写),一般用 XX_XX_XX 来命名
(2)final 修饰的属性在定义时,必须赋初值,并且以后不能再修改,赋值可以在如下位置之一
1. 在定义时
2. 在代码块中
3. 在构造器中
(3)如果 final 修饰的属性是静态的(不能在构造器中赋值),则初始化的位置只能是
1. 在定义时
2. 在静态代码块中
(4)final 类不能继承,但是可以实例化对象(可以创建一个 final 类的对象)
(5)如果类不是 final 类,但是含有 final 方法,则该方法不能重写
(6)代码规范:如果一个类已经是 final 类了,就没有必要再将该类中的方法修饰成 final 方法了
(7)包装类(Integer、Double、Float、Boolean 等都是 final),String 也是 final 类(不可变)
(8)final 和 static 往往搭配使用,效率更高,不会导致类加载(底层编译器做了优化处理)
1. static final 变量表示该变量属于哪个类,而不是某个实例
2. 当 final 和 static 一起使用时,通常用于声明常量(这里表示类常量),该常量值在类的所有实例中共享,且不可修改
为什么不会导致类加载?
(1) 编译器将 static final 的常量值直接存储到调用类的常量池中
(2) 使用该常量时,JVM 直接使用常量池中的值,不需要访问定义常量的类,自然就不会导致类的加载,提高了效率
代码示例
java
package final_;
public class main {
public static void main(String[] args) {
System.out.println(A.a);
}
}
class A{
public final static int a = 10;
static {
System.out.println("代码块被调用");
}
public A(){
System.out.println("构造器被调用");
}
}
// 输出结果
10代码分析
final 和 static 搭配使用修饰一个属性,调用该属性时不会导致类的加载,即不会执行代码块中的内容
