JAVA final关键字

final关键字

一、基本介绍

可以修饰类、属性、方法和局部变量

有以下需求时,常常用到final来修饰

  1. 当不希望类被继承时,可以用final修饰。
  2. 当不希望父类的某个方法被子类覆盖/重写(override)时,可以用final关键字修饰
    • 格式:访问修饰符 final 返回类型 方法名
  3. 当不希望类的某个属性的值被修改,可以用final修饰
  4. 当不希望某个局部变量被修改,可以用final修饰
package com.hspedu.final_;

public class Final01 {
    public static void main(String[] args) {
        E e = new E();
    }
}


//要求A类不能被其他类继承,这时用个final修饰A类即可
final class A{

}

/*class B extends A{

}*/

//如果要求hi不能被重写,但是可以被继承,故用final关键字即可
class C{

    public final void hi(){

    }
}

class D extends C{
    //重写了C类的hi方法
   /* public void hi() {
        super.hi();
    }*/
}

class E{
    public final double TAX_RATE = 0.08;//加了之后,实例化对象化,不能修改了
}

//当不希望局部变量被修改
class F{
    public void Cry(){
        final double NUM = 0.01;
//        NUM = 0.9;
        System.out.println("NUM=" + NUM);
    }
}

二、使用注意事项和细节

  1. final修饰的属性又叫常量,一般用 XX_XX_XX来命名(是大写的变量名)

  2. final修饰的属性在定义时,必须赋初始值,并且以后不能修改,赋值可以在下面三个位置之一

    • 定义时:public final double TAX_RATE = 0.08;
    • 在构造器中
    • 在代码块中
  3. 如果 final 修饰的属性是静态的,则初始化的位置只能是

    • 定义时
    • 在静态代码块 不能在构造器中
      • 因为static 的属性 会在类加载的时候被加载,final关键字修饰的属性必须有初始值,而构造器在类加载时不一定会调用,这个时候就没有初始值,所以不行
  4. final类不能继承,但是可以实例化对象

  5. 如果类没有被final修饰,但含有final修饰的方法,则该方法可以被继承,但是不能被重写

  6. 一般来说,如果一个类是final类了,就没必要用final去修饰方法了

  7. final不能修饰构造方法(即构造器)

  8. final和static 往往搭配使用,效率更高,不会导致类的加载。

    • 低层编译器做了优化
    package com.hspedu.final_;
    
    public class FinalDetail02 {
        public static void main(String[] args) {
            System.out.println(BBB.num1);
            //输出:10000
        }
    }
    
    //final和static 往往搭配使用,效率更高,不会导致类的加载。
    //低层编译器做了优化
    class BBB{
        public final static int num1 = 10000;
        static{
            System.out.println("BBB 静态变量被加载");
        }
    }
    
  9. 包装类(Integer Double,Float, Boolean)等都是final,String 也是final类

    • 这些类都是不能被继承的
posted @ 2022-02-18 11:27  DL50  阅读(21)  评论(0编辑  收藏  举报