Java的final有许多不同的用途,意义多少有点不同。
- final类
当类声明成final时,这个类无法被继承。也就是说不能定义final类的子类。
因为final类的类无法定义子类,所以final类声明的方法也不会被覆盖(override)。
- final方法
若将实例方法声明成final时,这个方法无法被子类所覆盖(override)。若将类方法声明成final时,这个方法无法被子类所隐藏(hide)。
补充说明:
实例的方法被子类的方法覆盖时,实际被调用的方法时在执行时决定的。
类方法被子类方法隐藏时,实例被调用的方法是在编译时决定的。
- final字段
final的字段值自能制定一次。
要将值指定给final变量字段,有下面两种方法:
第一种是在声明字段时就直接赋初始值
class Someting{
final int value = 123
}
另外一种则是在构造器中将值赋给字段(blank final)。
class Something{
final int value;
Something(){
this.value = 123;
}
}
要将值赋给final实例的字段,有下面两种方法:
第一种是在声明字段时就直接赋初始值。
class Someting{
static final int value = 123;
}
另一种则是在static块(静态初始化子)中将值赋给字段(blank final)。
class Something{
static final int value;
static {
value = 123;
}
}
final字段无法使用setValue类的seter方法再次赋其他值。
- final变量与final参数
局部变量与方法的参数,都可以声明成final。final的变量的值只能指定一次。
final参数的值则是一次都不能指定,因为方法被调用时,已经有值制定进去了。
摘自《Java多线程设计模式》