@[toc]
1.final关键字作用
1.final修饰的类不能被继承;
final class A {}
class B extends A {
//Cannot not inherit from final 'A'
}
2.父类final修饰的方法不能被被子类覆盖或者重写
class C {
//如果我们希望hi()这个方法不要被子类重写,可以用final关键字修饰
public final void hi() {}
}
class D extends C {
@Override
//'hi()' cannot override 'hi()' in 'C'; overridden method is final
public void hi() {
super.hi();
}
}
3.final修饰的属性不能被修改,但可以调用
public class Final01 {
public static void main(String[] args) {
E e = new E();
//Cannot assign a value to final variable 'TAX_RATE'
e.TAX_RATE = 0.09;
}
}
class E {
//不希望某个属性的值被修改,税率是固定的,不能被修改,用final修饰
public final double TAX_RATE = 0.08;
}
4.当不希望某个局部变量被修改
class F {
public void cry() {
//当不希望某个局部变量被修改
//Cannot assign a value to final variable 'NUM'
final double NUM = 0.01;
NUM = 0.9;
System.out.println("NUM=" + NUM);
}
}
2.细节
2.1 普通常量
final修饰的变量称为常量,在定义的时候必须赋值,赋值的方式有三种:
1.定义时直接赋值
class AA {
public final double TAX_RATE = 0.08;
}
2.在构造器中赋值
class AA {
public final double TAX_RATE;
public AA() {
TAX_RATE = 0.09;
}
}
3.在代码块中赋值
class AA {
public final double TAX_RATE;
{
TAX_RATE = 0.08;
}
}
错误案例
class AA {
//Variable 'TAX_RATE' might not have been initialized
(public final double TAX_RATE;)错误
}
2.2 静态常量
1.如果final修饰的属性是静态的,定义时赋值,不能在构造器中赋值
class BB {
public final static double TAX_RATE = 0.08;
}
2.静态代码块赋值
class BB {
public final static double TAX_RATE;
static {
TAX_RATE1 = 0.08;
}
}
2.3 其它细节
1.final类不能被继承,但可以被实例化
public class FinalDetail01 {
public static void main(String[] args) {
CC cc = new CC();
}
}
final class CC {}
2.如果类不是final类,但是含有final方法,则该方法不能被重写,但可以被继承
class DD {
public final void cal() {
System.out.println("cal()方法");
}
}
class EE extends DD {
public void m1() {
cal();
}
}
3.final类中的方法不必再用final修饰; 4.final不能修饰构造方法; 5.final和static搭配使用,不会导致类加载;
public class FinalDetail01 {
public static void main(String[] args) {
System.out.println(BBB.n1);//调用n1是类会被加载,静态代码块执行
System.out.println(BBB.n2);//调用final修饰的n2,类不会加载
System.out.println(BBB.n3);
}
}
class BBB {
public static int n1 = 100;
public final static int n2 = 200;
public static final int n3 = 300;//static、final位置可以互换
static {
System.out.println("BBB 静态代码块被执行……");
}
}
6.包装类和String是final类,不能被继承