在日常开发中,我们期望定义的属性、方法或类不被改变而保证能正确的运行,所以设计者为我们定义了final关键字,就如同其本身字面意思一样“不可改变的”。
原因
不可改变的定位也主要来自下面两个理由:
-
设计
-
效率
应用
final关键字在程序中的应用更能体现出其存在的原因,下面咱们结合几种应用场景来说明其存在意义。
1、属性
-
定义与赋值同时存在
这一种代表永不改变的编译时常量,在编译时编译器可将其常量值直接代入其使用位置进行常量替换并进行计算,增加了运行的效率。而这类常量必须为基本类型。与static结合更能使其只占据一段不可改变的存储空间。
相对于基本类型的修饰,同样可修饰一个对象引用,这时其引用不可改变,一旦指定了某个引用就可变更,但此时其指向的对象是可变的。
-
定义与赋值不同时存在
空白final就是代表这种情况,也就是说定义与赋值是分离的,在运行时进行赋值,这就大增加了其灵活性,针对类不同的对象在其定义的作用域或者构造方法来进行动态赋值且一旦完成即不可变动。
2、参数
虽然Java语言只存在值传递,但在传递参数仍存在基本类型与引用类型,当传递引用类型时,在方法内部就可能将其引用所指向的对象进行改变的潜在风险而导致后续程序无法按照预期执行,此时只需将其形参用final修饰即可避免这种风险。
3、方法
使用final修饰的方法即可避免继承类而进行覆盖,另外在早期版本,Java只要发现方法被final修饰那么它就会在编译时将所有此方法的调用方式转为内嵌调用(调用机制:将参数压入栈,跳至方法代码处并执行,完成后跳回并清理栈中参数,处理返回值),并使用代码副本来替代调用增加方法调用效率。但随着hotspot技术已优化掉此部分内嵌调用。
4、类
一旦final修饰了某个类就代表着该类不允许任何类进行继承,其内部定的方法都将隐式加上final关键字。
后话
-
所有private修改的方法均会隐式指定final
-
在使用final时往往是在明确了设计上的需求时达成的共识,这也许是好的,但也仅限于明确了需求的前提,因为你永远不能预见在你的设计上最终是如何的走势,否则也将限制设计的应用。
深入理解Java中的final关键字
final关键字用于确保属性、方法或类的不可变性,提升设计效率并增强代码安全性。它可以在常量、变量、参数、方法和类等不同场景下应用,如防止意外修改、禁止覆盖方法和阻止继承。final的使用需要基于明确的设计需求,但也可能限制未来的扩展性。
500

被折叠的 条评论
为什么被折叠?



