final 关键字可以修饰 变量 类 和方法
简单来说:
final修饰的数据不可修改,类不可被继承 , 方法不能被重写
详细来说:
final修饰数据
//final
private final int valueOne = 9;
//static 的 final
private static final int VALUE_TWO = 99;
// 如果不是基本类型就不能编译时初始化
private final int i4 = rand.nextInt(20);
//空final 其实final修饰数据的意思是 只允许赋值一次
//没赋值的final数据还有一次赋值机会
private final int i5;
//final参数 参数在方法中是不可变的(只读) 如果参数是引用则引用不可变
//多用于内部类
public void finalArgs( final int i ){
System.out.println(i);
}
final修饰方法:
final修饰的方法禁止覆盖(重写) 在java se6 之前使用final 方法可以提升运行效率。在新版本中可以不必考虑这点。
private的方法都是不可覆盖的,因为都是隐式的指定为 final 的,但你可以显式的添加final关键字并不会报错。
但值得注意的是,你是可以在子类中看起来覆盖了父类的方法:
public class FinalData {
private final void finalTest01() {
System.out.println("1");
}
}
class FinalData02 extends FinalData{
//这并不是覆盖 只是名字相同的两个方法
private final void finalTest01() {
System.out.println("2");
}
}
当你把父类的方法声明为private之后,在子类中,父类的方法其实相当于消失了(不存在),这时候在子类中新增加的方法其实就是和父类无关的新方法,即使名字一样,也没有任何关系。
这很容易让人混淆,所以在子类方法中重写方法加上@Override注解可以减少错误发生。
final修饰类
final修饰的类就相当于你把类阉了,类就没办法产生子类了(滑稽)
也就相当于给final类中所有方法都加上了final ,同样的,你手动的加上的方法的final编译器也不会报错,但这是无用的,属于画蛇添足。