一、final关键字
- final的使用情况:
- final :最后的,最终的;可以修饰类,属性,方法和局部变量。
-
- 当不希望类
被继承
时
-
- 当不希望父类的某个方法
被子类覆盖/重写时
-
- 当不希望类的某个属性值
被修改
-
- 当不希望某个局部变量被修改的时候
public class final01 {
public static void main(String[] args) {
E e = new E();
}
}
final class A{}
class C{
public final void hi(){}
}
class D extends C{
}
class E{
public final double TAX_RATE=0.08;
public void say(){
int a=10;
a=100;
final int d=20;
}
}
一、1、final使用注意事项和细节:
- final修饰的属性又叫常量,一般用XX_XX_XX命名
- final修饰的属性在定义时,必须赋初值,并且以后不能再修改,赋值可以在一下位置之一:
-
- 在属性定义的时候,如public final double MAX=0.09;
-
- 在构造器中
-
- 在代码块中
class AA{
public final double TAX_RATE1=0.9;
public final double TAX_RATE2;
public final double TAX_RATE3;
public AA(){
TAX_RATE2=0.8;
}
{
TAX_RATE3=0.8;
}
}
- 如果final修饰的属性是静态的,则赋初值的位置只能在
-
- 定义时
-
- 静态代码块中
- 不能在构造器中
- 不能在构造器中赋初值,因为静态属性是在类加载的时候初始化的
- 有可能在类加载的时候,但是构造器还没调用(因为是类加载完过后才有可能执行构造器)
class BB{
public static final double TAX_RATE11=0.8;
public static final double TAX_RATE12;
static {
TAX_RATE12=0.4;
}
public BB(){
}
}
- final类不能被继承,但是可以实例化对象
- 如果类不是final,但含有final方法,则该方法虽然不能重写,但是可以被继承
- 一般来说,如果一个类已经是final类,就没有必要再将方法修饰为final方法
- final不能修饰构造器
- final和static往往搭配使用,效率更高,不会导致类加载,底层编译器做了优化处理。
public class final03 {
public static void main(String[] args) {
System.out.println(BBB.num);
}
}
class BBB{
public final static int num=10;
static {
System.out.println("BBB 构造器被调用");
}
}
- 包装类(Integer,Double,Float,Boolean等都是final类),String类也是final修饰的