Java修饰符 --- final

final 关键字的好处:

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

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

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

@

一、修饰变量

  • 当 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 修饰类的时候,谨慎选择,除非以后不会用来继承或者出于安全考虑
posted @ 2021-10-08 14:17  长歌→  阅读(90)  评论(0编辑  收藏  举报