final关键字
final关键字 可以修饰 类、方法、属性、局部变量
- 当不希望类被继承时,可以用final修饰。
final class A{}
//用final修A类,B类是无法继承A类。
class B extends A{}
- 当不希望父类的某个方法被子类覆盖/重写(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 方法..");
//}
}
- 当不希望类的某个属性的值被修改,可以用final修饰。
class E {
public final int num = 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;
}
}
- 如果 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类。