什么是final?
final意指:“这是不能改变的”,防止改变的原因有两个:一是从设计上的考虑,二是从效率上考虑,具体分析需要考虑其特定的作用对象。final可作用于属性、方法、类。下面分别从这三个方面来讨论。
final作用于属性
当final作用于属性时,旨在告诉编译器这是一个不会改变的常量,编译器可以把常量带入计算中,也就是说,可以在编译时计算,减少了一些运行时的负担。
在java中,final修饰的属性必须是基本类型,必须在定义时进行初始化。
一个被static和final同时修饰的属性只会占用一段不能改变的存储空间。
final修饰的属性也可以是对象,但是其含义就会有所不同。对于对象引用, final使引用恒定不变。一旦引用被初始化指向了某个对象,它就不能改为指向其他对象。但是,对象本身是可以修改的,这一限制同样适用数组,数组也是对象。
如果final修饰的属性没有进行初始化,编译器要确保在其使用之前必须被初始化,通常可以在构造器中进行初始化,以保证其使用之前是被初始化过的。
按照惯例,带有恒定初始值的 final static 基本变量(即编译时常量)命名全部使用大写,单词之间用下划线分隔。(源于 C 语言中定义常量的方式。)
final作用于方法
将final作用于方法的主要原因是给方法上锁,防止子类通过覆写改变方法的行为。这是出于继承的考虑,确保方法的行为不会因继承而改变。
那么final与private两者有什么关系呢?
类中所有的 private 方法都隐式地指定为 final。因为不能访问 private 方法,所以不能覆写它。可以给 private 方法添加 final 修饰,但是并不能给方法带来额外的效用。也就是用private修饰的方法,不需要再用final修饰。
final作用于类
当final作用于类时,就意味着它不能被继承,该类的设计永远不需要再改动或者处于安全的考虑不希望它有子类。
当final作用于类时,其类中的所有方法都被隐式的指定为final。
评论区