final关键字可以用来修饰数据、方法和类,意为“不可改变的”
1.final数据
(1)final常量
在java中,编译期常量(数值恒定不变)必须是基本数据类型,且用final表示,在定义时必须对其初始化。
当对象引用用final表示时,一旦引用被初始化指向某一个对象,就无法再改而指向另一个对象,但对象中的内容是可以被修改的。
数组也是对象,因此上述原则同样适用。
一段同时被static和final修饰的域,仅占据一段不能改变的数据空间。
对常量的常用定义形式:
public static final int VALUE_ONE = 10;
(2)空白final
定义数据时声明为final但不对其进行初始化,改而在构造器中对其进行初始化。可以用于针对不同对象final域有所不同,但又恒定不变。
class Poppet{
private final int i;
Poppet(int i){
this.i = i;
System.out.println(" "+this.i);
}
}
public class BlankFinal {
private final int j;
private Poppet p;
BlankFinal(int x){
j = x;
p = new Poppet(x);
}
public static void main(String[] args) {
new BlankFinal(5);
new BlankFinal(10);
}
}
(3)final参数
方法传入的对象引用类型指明为final时,意味着在方法中无法改变引用所指向的对象;当基本类型被指明为final时,只能读取该参数,但不能改变其值。
2.final方法
将方法定义为final,一般是为了防止继承类对它进行修改覆盖。
类中的所有private方法实际上都被隐式地指定为final,因为private方法对外是不可见的,即使继承类都无法调用父类的private方法。
即便继承类试图“覆盖”父类的private方法,编译也不会出错,但实际上只是在继承类中新定义了与父类private方法名字相同的方法而已。
3.final类禁止继承
final类中所有的方法都默认为final,因为此时无法再覆盖它们。但final类的非私有变量没有此限制。