【Java笔记】15 final

一、介绍

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

使用final:

  1. 不希望类被继承时

    1. final class A{}
    2. // class B extends A{} 此时A类不能被继承
  2. 不希望父类的某个方法被子类覆盖/重写时

    1. class C{
    2. // 要求hi不能被子类重写,可以使用final修饰hi方法
    3. public final void hi(){}
    4. }
    5. class D extends C{
    6. //此时不能重写hi()方法
    7. // @Override
    8. // public void hi(){
    9. // System.out.println("重写");
    10. // }
    11. }
  3. 不希望类的某个属性的值被修改

    1. public class final_ {
    2. public static void main(String[] args) {
    3. E e = new E();
    4. // e.TAX_RATE = 0.09; 此时不能更改
    5. }
    6. }
    7. class E{
    8. public final double TAX_RATE = 0.08;
    9. }
  4. 不希望某个局部变量被修改

    1. class F{
    2. public void cry(){
    3. final double NUM = 0.01; //NUM不能更改
    4. }
    5. }

二、注意事项

  1. final修饰的属性又叫常量,一般用XXX_XX_XXX来命名
  2. final修饰的属性在定义时,必须赋初值,且以后不能再修改,赋值可以在:

    • 定义时
    • 在构造器中
    • 在代码块中 ```java class AA{ public final double TAX_RATE = 0.1;// 1. 在定义时 public final double TAX_RATE1; public final double TAX_RATE2;

    // 2. 在构造器中赋值 public AA(){

    1. TAX_RATE1 = 0.2;

    }

    // 3. 在代码块赋值 {

    1. TAX_RATE2 = 0.3;

    } } ```

  3. 如果final修饰的属性是静态的,则初始化的位置

    • 定义时
    • 在静态代码块
      1. class BB{
      2. public static final double TAX_RATE3 = 0.3; // 1. 定义时
      3. public static final double TAX_RATE4;
      4. // 2. 在静态代码块中
      5. static {
      6. TAX_RATE4 = 0.4;
      7. }
      8. }
  4. final类不能继承,但可以实例化对象

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

    1. class DD{
    2. public final void cal(){
    3. System.out.println("cal()方法");
    4. }
    5. }
    6. class EE extends DD{}
  6. 一般来说,如果一个类已经时final类了,就没有必要再将方法修饰成final方法

  7. final不能修饰构造方法(即构造器)
  8. final和static往往搭配使用,效率更高,不会导致类加载,底层编译器做了优化处理
    ```java public class FinalDetail02 { public static void main(String[] args) {
    1. System.out.println(BBB.num);
    } }

class BBB{ public final static int num = 1000; static { System.out.println(“BBB静态代码块被执行”); } } ```

1000

“BBB静态代码块被执行”不会输出,类没有加载

  1. 包装类(Integer,Double,Float,Boolean等都是final),String也是。