Java中 详细讲解 final的作用性

104 阅读2分钟

final关键字

final关键字 可以修饰 类、方法、属性、局部变量

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

final class A{}

//用final修A类,B类是无法继承A类。
class B extends A{} 
  1. 当不希望父类的某个方法被子类覆盖/重写(override)时,可以用final关系修饰。

class C {
    //如果我们要求 c_fianl 不能被子类重写,可以使用 final 修饰 c_fianl 方法
    public final void c_fianl() {}
}
class D extends C {
     //@Override
     //public void c_fianl() {
     //    System.out.println("重写了 C 类的 c_fianl 方法..");
     //}
}
  1. 当不希望类的某个属性的值被修改,可以用final修饰。

class E {
    public final int num = 1;//常量
}
  1. 当不希望某个局部变量被修改,可以使用final修饰。

class F {
    public void cry() {
        //这里 num 也称为 局部常量
        final double num = 0.01;
    }
}

final 注意事项和细节讨论

1) final修饰的属性又叫常量,一般用xx_xx_xx来命名。

2) final修饰的属性在定义时,必须赋初值,并且以后不能再修改,赋值可以如下位置之一:

   
class Detail1 {
    
    /*
        1. 定义时:如 public final double TAX_RATE=0.08;
        2. 在构造器中
        3. 在代码块中
    */
    
    public final double TAX_RATE = 0.001;  //定义时赋值
    public final double TAX_RATE2;
    public final double TAX_RATE3;

    public Detail1() {  //构造器中赋值
        TAX_RATE2 = 1.1;
    }

    { //在代码块赋值
        TAX_RATE3 = 8.8;
    }
}
  1. 如果 final 修饰的属性是静态的,则初始化的位置只能是:

class Detail2 {
    /*
        1. 定义时 
        2. 在静态代码块 不能在构造器中赋值。
    */
    public static final double TAX_RATE = 99.9;
    public static final double TAX_RATE2 ;
    
    //静态变量的初始化 类加载的时候 就要赋值
    public static final double TAX_RATE3 ;  //报错

    static {
        TAX_RATE2 = 3.3;
    }

    // 构造器被创建对象时,才会触发(调用)
    public Detail2() {
        TAX_RATE3 = 5.5;
    }
}

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


Detail3 detail3 = new Detail3();

final class Detail3{ }

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

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

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



System.out.println(new Detail4().TAX_RATE); //输出888
//静态代码块不会被执行

class Detail4 {

    public final static int TAX_RATE = 888;

    static {
        System.out.println("Detail4 静态代码块被执行");
    }
}

8) 包装类(Integer、Double、Float、Boolean等)、String也是final类。