
3.4 final修饰符
在本书第1章中介绍过使用final修饰符可以声明一个常量。但从更广泛的意义上说final可以用来修饰局部变量以及类和实例字段、静态字段、方法等类的成员,使之在第一次初始化后就不能再被变更。
3.4.1 使用final修饰类及其成员
final的中文含义是“最终的”。顾名思义,使用final修饰符的类或类的成员在第一次初始化后就不能再被更改了。
1.使用final修饰类和方法
用final修饰符的类称为最终类,表明这个类不能被继承。也就是说,如果希望一个类永远不会让其他类当作父类来继承,就可以用final进行修饰。需要注意的是,final类中所有方法成员都会被隐式地指定为final方法。使用final修饰符的方法将不能被子类覆盖,它主要用于锁定方法以防任何子类对其进行重写。
在使用final修饰类时要谨慎考虑,在一般情况下尽量不要将类设计为final类。除非出于安全的考虑或者这个类确实在以后不会被用作父类。
2.使用final修饰类的字段
字段是随着类初始化或对象初始化而初始化的。当类被初始化时,也就是静态初始化器代码被执行时,系统会为类的静态字段分配内存空间;当创建对象时,也就是类的构造方法被调用时,系统会给对象的实例字段分配内存空间。
当使用final修饰实例字段或静态字段时,这些字段一旦有了初始值后就不能被重新赋值。所以也将使用final修饰符的实例字段或静态字段称为最终字段。显然,使用了final修饰符又没有赋以初始值的实例字段或静态字段就没有任何存在的意义了。对使用了final修饰符的静态字段必须在定义它们的时候就直接为其指定初始值,或者在类的构造方法及静态初始化器中指定其初始值。例如:

使用类的构造方法或静态构造器的赋值方式,特别适合需要为final字段进行有选择、按条件赋值的情况。例如:


3.4.2 使用final修饰基本类型和引用类型变量的区别
使用final修饰基本类型变量时,由于不能对其进行重新赋值,所以不能改变变量的值。但对于引用型变量而言,它保存的仅仅是一个引用(对象的内存地址),所以只要保证这个引用的地址不被改变即可。也就是说会一直引用同一个对象,但这个对象完全是可以发生变化的。例如:
