深入java final关键字 基本用法、注意点和优点

本文讲解final的基本用法和里面的优缺点,原创不易,转载请注明出处
文章分为3部分,分别会给大家介绍final关键字对类,方法和变量的修饰所起到的作用,以及一些优点,对于缺点大家可以参考《JAVA编程思想》第四版 156页。

  • final类及其优点
  • final方法 及里面要注意的一些小点
  • final数据和final自变量 及我们需要注意的一些点(下一篇文章再说)

一:final类及其优点

如果我们用final关键字修饰java类的时候,那这个类就成为了final类。
为什么使用final类:

1.这个类已经是一个十分完善的类,我们不会对其进行任何的改变,不希望这个类被任何人继承改变它。
2.出于安全考虑,我们不希望进行子类化处理。
3.我们希望jvm在处理的时候,不再关心类是否被继承,jvm不需要更多额外的处理,提高执行效率。
4.将类定义成 final后,结果只是禁止进行继承——没有更多的限制。然而,由于它禁止了继承,所以一个 final类中的所有方法都默认为 final。final方法在编译阶段绑定,称为静态绑定(static binding),编译时常量,永远不可改变。jvm在运行的时候,会直接将final方法直接嵌进来,效率会大大提升。

常见的final类:
String Integer Double Boolean等等常见的包装类都是不可变类。

final类的对象:

二:final方法 及里面要注意的一些小点

方法前面加上final关键字,代表这个方法不可以被子类的方法重写,这个方法就成为了final方法。一个方法的功能已经足够完整了,子类中不需要改变的话,你可以声明此方法为final。

为什么使用final方法:
1.一个方法的功能已经足够完整了,子类中不需要改变的话,就声明此方法为final。
2.final方法比非final方法要快,因为在编译的时候已经静态绑定了,不需要在运行时再动态绑定。
3.要使用final 方法,可能是出于对两方面理由的考虑:

第一:为方法“上锁”,防止任何继承类改变它的本来含义。设计程序时,若希望一个方法的行为在继承期间保持不变,而且不可被覆盖或改写,就可以采取这种做法。
第二:程序执行的效率。将一个方法设成 final 后,编译器就可以把对那个方法的所有调用都置入“嵌入”调用里。只要编译器发现一个final 方法调用,就会(根据它自己的判断)忽略为执行方法调用机制而采取的常规代码插入方法(将自变量压入堆栈;跳至方法代码并执行它;跳回来;清除堆栈自变量;最后对返回值进行处理)。相反,它会用方法主体内实际代码的一个副本来替换方法调用。这样做可避免方法调用时的系统开销。

我们需要注意到:若方法体积太大,那么程序也会变得雍肿,可能受到到不到嵌入代码所带来的任何性能提升。因为任何提升都被花在方法内部的时间抵消了。Java 编译器能自动侦测这些情况,并颇为“明智”地决定是否嵌入一个final 方法。然而,最好还是不要完全相信编译器能正确地作出所有判断。通常,只有在方法的代码量非常少,或者想明确禁止方法被覆盖的时候,才应考虑将一个方法设为final。


三:final数据和final自变量 及我们需要注意的一些点(下一篇文章再说)

final成员变量和自变量是指我们在成员变量和自变量前加final关键字修饰。

注意点:
1.final成员变量必须在声明的时候初始化(static代码块和普通代码块)或者在构造器(构造函数)中初始化,否则就会报编译错误。
2.不能够对final变量再次赋值。
3.在匿名类中所有变量都必须是final变量。
4.(没有在声明时初始化final变量的称为空白final变量(blank final variable),它们必须在构造器中初始化,或者调用this()初始化。不这么做的话,编译器会报错“final变量(变量名)需要进行初始化”。)
5.JVM和Java应用都会缓存final变量,以提高性能。
6.final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值