final关键字

34 阅读2分钟

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

在某些情况下,程序员可能有以下需求,就会使用到final

  1. 当不希望类被继承时,可以用final修饰.

final class A {
}

// 报错
class B extends A {
}
  1. 当不希望父类的某个方法被子类覆盖/重写(override)时,可以用final关键字 修饰。
class C {
    public final void hi() {
    }
}

class D extends C {
    // 不能重写final方法 报错
    @Override
    public void hi() {
        super.hi();
    }
}
  1. 当不希望类的的某个属性的值被修改,可以用final修饰.
package com.hspedu.final_;

public class Final01 {
    public static void main(String[] args) {
        E e = new E();
        //  e.n1 = 100; //编译错误,因为n1是final
        e.n1 = 100;
    }
}

class E {
    public final int n1 = 10;

}
  1. 当不希望某个局部变量被修改,可以使用final修饰
class F {
    public void hi() {
        final double NUM = 10;
				// 局部常量 报错
        NUM = 0.9;
        System.out.println(NUM);
    }
}

细节

  1. final修饰的属性又叫常量一般用XX_XX_XX来命名

  2. final修饰的属性在定义时,必须赋初值,并且以后不能再修改,赋值可以在如 下位置之一[选择一个位置赋初值即可] : ①定义时:如public final double TAX_RATE=0.08; ②在构造器中 ③在代码块中

    package com.hspedu.final_;
    
    public class FinalDetail01 {
        public static void main(String[] args) {
    
        }
    }
    
    class AA{
        public final double TAX_RATE = 0.08;//1.定义时赋值
        public final double TAX_RATE2 ;
        public final double TAX_RATE3 ;
        public AA() {
            //构造器中赋值
            TAX_RATE2 = 1.1;
        }
        {
            //在代码块赋值
            TAX_RATE3 = 8.8;
        }
    }
    
  3. 如果final修饰的属性是静态的,则初始化的位置只能是

    ①定义时

    ②可在静态代码块,不能在构造器中赋值。

  4. final类不能继承, 但是可以实例化对象。

    package com.hspedu.final_;
    
    public class FinalDetail01 {
        public static void main(String[] args) {
            new AA();
        }
    }
    
    final class AA {
    
    }
    
  5. 如果类不是final类,但是含有final方法,则该方法虽然不能重写,但是可 以被继承。

  6. 一般来说,如果一个类已经是final类了,就没有必要再将方法修饰成final方法。

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

  8. final和static往往搭配使用,效率更高,不会导致类加载.底层编译器做了优化处理。

    package com.hspedu.final_;
    
    public class FinalDetail01 {
        public static void main(String[] args) {
            System.out.println(BBB.num);
        }
    }
    
    //final 和 static 往往搭配使用,效率更高,不会导致类加载.底层编译器做了优化处理
    class BBB {
        public final static int num = 10000;
    
        static {
            System.out.println("BBB 静态代码块被执行");
        }
    }
    

    输出
    1000