final关键字
final 可以修饰类、属性、方法、和局部变量
应用场景:
- 当不希望类被继承
- 当不希望父类的某个方法被子类覆盖/重写
- 当不希望类的某个属性的值被修改
- 当不希望某个局部变量被修改
final细节:
-
final修饰的属性又叫常量,一般用(大写)XX_XX_XX 来命名
-
final修饰的属性在定义时,必须赋初值,并且以后不能再修改,赋值可以在如下位置(选择一个位置赋初值即可):
-
定义时:
public final double TAX_RATE=0.01;
-
在构造器中赋值
public final double TAX_RATE2; public Final01() { TAX_RATE2 = 0.1; }
-
在代码块中赋值
public final double TAX_RATE3; { TAX_RATE3 = 0.11 }
-
-
如果final修饰的属性是静态的,不能在构造器中赋值,则初始化的位置只能是
-
定义时
public static final double TAX_RTE4 = 99;
-
在静态代码块中
public static final double TAX_RTE5; static { TAX_RTE5 = 44; }
-
-
final类不能继承,但是可以实例化对象
-
如果类不是final类,但含有final方法,则该方法虽然不能重写,但是可以被继承,不影响使用
...main (...){ EE ee = new EE; ee.cal(); } class DD{ public final void cal(){ System.out.println("cal()方法"); } } class EE extends DD{} //能输出cal方法,但不能重写
-
如果一个类已经是final类了,就没必要再将方法修饰成final方法
-
final不能修饰构造方法(即构造器)
-
final 和 static 往往搭配使用,效率更高,位置顺序都可以(final static 和 static final 一样),不会导致类加载,底层编译器做了优化处理
...main(...){ System.out.println(BBB.num); } class BBB{ public static final int num = 100; static { System.out.println("BBB 静态代码块被执行"); } } //
-
包装类(Integer,Double,Float,Boolean等都是final类),String也是final类,这些类都是不可以被继承的。