final
final意思是不可修改,类似于c++中const,但final应用范围比const广,final可修饰范围包括:
- 数据对象
- 方法成员
- 类
修饰数据对象
final修饰数据对象意义同const,final可修饰数据对象包括:
- static数据成员对象
- non-static数据成员对象
- 方法参数对象
- 方法局部对象
blank final
一般来说,final修饰数据对象都显式初始化,这样final数据对象就含自定义初始值,没有显式初始化的final数据对象称为blank final数据对象:
- non-blank final数据对象:显式初始化
- blank final数据对象:无显式初始化
blank final除了继承non-blank final的不可修改含义,在初始化上做了一些限制,没有显式初始化的blank final数据对象毫无意义
- blank final static数据成员对象:final static数据成员对象必须在定义处显式初始化,否则编译error,因此不存在blank final static数据成员对象
- blank final non-static数据成员对象:必须在所有构造函数初始化(如果类含多个构造函数),确保实例对象构造完毕后,blank final non-static数据成员对象完成显式初始化(blank final non-static数据成员对象只能初始化一次,第一次”=“为初始化,之后”=“为赋值运算符,违背final不可修改含义)
- blank final 方法参数对象:方法参数对象值在方法调用时通过实参(默认实参)传递,因此必然含自定义初始值,因此不存在blank final方法参数对象
- blank final 方法局部对象:要求在方法作用域内如果被引用就必须含自定义初始值,因此blank final方法局部对象在引用之前必须初始化,规则同non-static数据成员对象(只能初始化一次,第一次”=“为初始化,之后”=“为赋值运算符,违背final不可修改含义),如果blank final方法局部对象不会被引用,可不初始化(blank final方法局部对象不会被引用,则该对象本身是冗余的,应删除)
修饰方法
final可修饰方法:
- static方法
- non-static方法
final修饰方法表示对应方法不能被子类override,阻止final方法多态行为,因为子类无法override final方法,因此final方法编译期bind(通过对应类引用调用final方法)
注:static方法本身编译期bind,因此final修饰static方法意义不大,但final static方法仍可阻止子类override
final修饰方法规则:
- private方法本身就不可能被子类覆写,因此final修饰private方法无意义,尽管语法上可这么做
- final不能修饰abstract method,因为abstract method天然要求子类override abstract method
- final不能修饰interface method,因此interface method天然要求子类override interface method
修饰类
final修饰类表示该类不能被继承,阻止子类改变final类行为,final类本质就是类所有方法为final方法(构造函数除外)
final修饰类规则:
- final不能修饰abstract class,因为abstract class包含abstract method,abstract method天然要求子类override abstract method
- final不能修饰interface,因为interface包含interface method,interface method天然要求子类override interface method