一、final——终极修饰符
- 修饰属性:被final修饰符修饰的
属性
和局部变量
都不能被重新赋值(见下例一),所以为了节省内存空间将被final修饰的属性同时被static
修饰,习惯书写顺序为static final
,如果定义为static,则强调只有一份。(见下例二)- 修饰基本数据类型,可以认为该数据是常量
- 修饰类的对象,可以认为该数据和其所指向的对象之间的绑定关系不可更改,但该数据指向的对象的属性是可更改的,即对象的引用不会改变,但对象本身可以改变
注: final是唯一一个既可修饰属性又可以修饰局部变量的修饰符
- 修饰方法:不能在子类中被覆盖,但可以被重载!! 使用final修饰方法有两个目的,一个是防止继承类对其进行更改,另外一个原因是效率,在早期的java版本中,会将final方法转为内嵌调用。但若方法过于庞大,可能在性能上不会有多大提升。因此在最近版本中,不需要final方法进行这些优化了。
- 修饰类:不能被继承
- 如果一个类被final修饰,说明这个类不可能有子类,类中的方法也一定是final方法。
【例一】
class A {
private int i;
A(int a) {
i = a; }
private int x = 9;
void setI(int i) {
this.i = i; }
}
public class BlankFinal {
private final int j;
private final A a;
public BlankFinal() {
j = 1;
a = new A(1);
}
public static void main(String args[]) {
final int con = 100;
con = 1000; // The final local variable can't be assigned.
BlankFinal b = new BlankFinal();
b.j = 5; // The final field BlankFinal.j can't be assigned.
b.a = new A(3); // The final field BlankFinal.a can't be assigned.
b.a.setI(10);
b.x++;
}
}
【例二】static final 和 final
class TestFinal {
private static Random ran = new Random();
private static final int a = ran.nextInt(99);
private final int b = ran.nextInt(99);