final 关键字的好处:

1.final 关键字提高了性能,JVM 和 Java 应用都会缓存 final

2.final 变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销

3.使用 final 关键字,JVM 会对方法、变量以及类进行优化


Java关键字 --- final

  • 一、修饰变量
  • 二、类的 final 变量和普通变量的区别?
  • 三、修饰方法
  • 四、修饰类


一、修饰变量

  • 当 final 修饰一个基本数据类型或者引用类型时,一旦在初始化之后,值不能改变,但是引用类型指向的对象的值是可以改变的(因为引用类型存的是一个地址,被 final 修饰时,地址不变就好了)
  • final 修饰成员变量是,必须要显示初始化,要么是在声明的时候赋值,要么是在该变量所在类的构造函数对变量进行赋值,局部变量则是在使用之前初始化就好了
  • 注意:final 修饰对象,进行声明时,必须初始化的值要是具体的对象,不能是指向另一个对象
public class finalTest {
    
    public static void main(String[] args) {
        final person pers = new person();
        pers = new person();
    }
}

class person{
    String name = "张无忌";
}

例如上述代码中:pers = new person();在编译是就会报错,就是因为pers 被 final 修饰,不能再指向其他对象

二、类的 final 变量和普通变量的区别?

  • 例子:
public class staticTest {
  
      public static void main(String[] args) {
          String A = "final999";
          final String B = "final";
          String C = "final";
          String str1 = B + 999;
          String str2 = C + 999;
          System.out.println(A == str1);// true
          System.out.println(A == str2);//false
          System.out.println(str1.equals(str2));//true
      }
  }
  • 可以从结果看出,str1str2两个对象的内容是相等的,但是之所以一个为 true,一个为 false,就是 final 修饰变量和普通变量的区别了
    首先,对象 A 的值"final999"存储在常量池,str2 的值为引用变量 C 拼接"999",对应变量 C 的访问需要在运行时通过存储的地址才能确定,而 str1 被 final 修饰,当变量为基本数据类型、String类型时,编译器会把他当作编译期常量使用(静态绑定),也就是编译期的时候,str1 的值就完成了拼接,为"final999"

三、修饰方法

  • 使用 final 方法的原因:其一是将方法锁定,防止任何继承类修改它的含义,其二是提高效率,因为在编译时已经静态绑定了,不需要在运行时动态绑定
  • 父类中被 final 修饰的方法,不能被重写(因为重写的前提就是子类继承父类的方法),需要注意的是,如果父类中 final 修饰的方法同时访问权限为 private,子类就可以定义相同的方法名和参数,因为子类没有直接继承,而是重新定义的
public class finalTest extends A {

    public static void main(String[] args) {
    }

    public void set() {
    }
}

class A {
    //当方法为public时,报错
//    public final void set(){
//    }

    private final void set() {
    }
}

四、修饰类

  • 当 final 修饰一个类时,表明这个类不能被继承
  • 需要注意的是:final 类中的成员变量可以自行设为 final,但是 final 类中所有的成员方法都会被隐式地指定为 final 方法
  • 使用 final 修饰类的时候,谨慎选择,除非以后不会用来继承或者出于安全考虑