【Java笔记】15 final
一、介绍
final可以修饰类、属性、方法和局部变量
使用final:
不希望类被继承时
final class A{}// class B extends A{} 此时A类不能被继承
不希望父类的某个方法被子类覆盖/重写时
class C{// 要求hi不能被子类重写,可以使用final修饰hi方法public final void hi(){}}class D extends C{//此时不能重写hi()方法// @Override// public void hi(){// System.out.println("重写");// }}
不希望类的某个属性的值被修改
public class final_ {public static void main(String[] args) {E e = new E();// e.TAX_RATE = 0.09; 此时不能更改}}class E{public final double TAX_RATE = 0.08;}
不希望某个局部变量被修改
class F{public void cry(){final double NUM = 0.01; //NUM不能更改}}
二、注意事项
- final修饰的属性又叫常量,一般用XXX_XX_XXX来命名
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(){
TAX_RATE1 = 0.2;
}
// 3. 在代码块赋值 {
TAX_RATE2 = 0.3;
} } ```
如果final修饰的属性是静态的,则初始化的位置
- 定义时
- 在静态代码块
class BB{public static final double TAX_RATE3 = 0.3; // 1. 定义时public static final double TAX_RATE4;// 2. 在静态代码块中static {TAX_RATE4 = 0.4;}}
final类不能继承,但可以实例化对象
如果类不是final类,但含有final方法,则该方法虽然不能重写,但可以被继承
class DD{public final void cal(){System.out.println("cal()方法");}}class EE extends DD{}
一般来说,如果一个类已经时final类了,就没有必要再将方法修饰成final方法
- final不能修饰构造方法(即构造器)
- final和static往往搭配使用,效率更高,不会导致类加载,底层编译器做了优化处理
```java public class FinalDetail02 { public static void main(String[] args) {
} }System.out.println(BBB.num);
class BBB{ public final static int num = 1000; static { System.out.println(“BBB静态代码块被执行”); } } ```
1000
“BBB静态代码块被执行”不会输出,类没有加载
- 包装类(Integer,Double,Float,Boolean等都是final),String也是。
