【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也是。