面向对象编程
final关键字
1 final关键字是什么
1) final
关键字属于Java中的关键字,其能修饰的结构有:类、方法和变量。
2) final
关键字的作用为限定其修饰的结构为“最终版本”,简单地说,不会改变。
2 final类
- 类的改变体现在其子类上,因为子类相当于在父类的基础上扩展功能。
final类
意味着该类限定为没有子类的类。
因此,对于不需要再扩展功能的类,可以用final
来修饰。- 比如:String类、System类、StringBuffer类
3 final方法
- 方法的改变体现在对其重写上,方法的重写相当于给该方法扩展了一个版本。
final方法
意味着该方法限定为不能被重写的方法。- 比如,Object类中的
getClass()
方法。
另外,查看该方法的源码会发现除了被final
修饰,该方法还被native
关键字修饰,而被native
关键字修饰的方法没有方法体,这意味着该方法具体实现为调用底层c或c++代码,不是用Java实现,隐藏这些代码,不对外开放。
4 final变量
在类中,变量包括局部变量(方法中的变量和形参)和属性2种。
1) final局部变量final局部变量
表示该变量的值不能被改变。
- 对于方法中的变量,体现在,方法中一旦定义了
final变量
,即不能进行对该变量的值改变的操作。 - 对于方法中的形参,体现在,在方法中不能进行对该形参的值改变的操作。调用时的传入实参,就是为形参赋值。
简单地说,final局部变量
就是方法中限定为不能进行值操作的变量。注意,并没有要求一定要赋值,只是限定不能对其进行值操作。
2) final属性final属性
不同于final局部变量
,final属性
代表着类或对象具有的具有确定值,且不会改变(即无法进行值操作)的属性。
也就是说,final属性
必须满足2两点:
final属性
必须一开始就有确定的值。换句话说,不能使用默认初始化。- 若为
类final属性
(即static也修饰的),要在类加载完成时,该属性有确定的值。 - 理解:类的属性即
static属性
,一旦类加载完成后,这类属性只能通过类或对象来访问值或者修改值,但final
限定不能修改值,因此static final属性
只能被类或对象访问值,因此必须在类加载完成之前,就完成static final属性
的值的确定。 - 因此,
类final属性
初始化的情况只有2种:1)显式初始化 2)static代码块初始化。 - 若为
对象final属性
,在对象实例化完成后该属性有确定的值。 - 理解:对象的属性,一旦对象完成实例化,其属性只能被对象访问或修改值,但
final
限定不能修改值,因此只能被对象访问值,因此必须在对象完成实例化之前就确定其final属性
的值。 - 因此,
对象final属性
初始化的情况有3种:1)显式初始化 2)代码块初始化 3)构造器初始化
- 若为
final属性
不能进行值操作。
最后有一个小点,static final属性
也称为全局常量,意味着该属性有确定的值且不会改变,并且随类加载而加载,只存在一份,所有对象共享。
3) 由于final变量
就是值不会改变的变量,因此final变量
实际上就是常量。也就是说,不论是final局部变量
还是final属性
,定义时应符合常量的标识符命名规则、规范,也就是全部大写。