Skip to content

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 搭配使用修饰一个属性,调用该属性时不会导致类的加载,即不会执行代码块中的内容