java 中的 final 关键字

        final在Java中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变量再次初始化的话,编译器会报编译错误。

一。使用 final关键字的 好处

1.1. final关键字提高了性能。JVM和Java应用都会缓存final变量。

1.2. final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。

1.3. 使用final关键字,JVM会对方法、变量及类进行优化。

1.4. 创建不可变类要使用final关键字。不可变类是指它的对象一旦被创建了就不能被更改了。String是不可变类的代表。不可变类有很多好处,譬如它们的对象是只读的,可以在多线程环境下安全的共享,不用额外的同步开销等等。

二。 final 关键字的 基本用法

 2.1. 修饰 类

       当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。

  注意:在使用final修饰类的时候,除非这个类真的在以后不会用来继承或者出于安全的考虑,尽量不要将类设计为final类。

2.2. 修饰 方法

       所有被final标注的方法都是不能被继承、更改的。

       下面这段话摘自《Java编程思想》第四版第143页:

   “使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。”

   注意:只有在想明确禁止 该方法在子类中被覆盖的情况下才将方法设置为 final 的。即父类的final方法是不能被子类所覆盖的。final 方法比非final方法要快,因为在编译的时候已经静态绑定了,不需要在运行时再动态绑定。

2.3. 修饰 变量(成员变量和局部变量)

       final 成员变量表示常量,只能被赋值一次,赋值后值不再改变。final修饰一个成员变量(属性),必须要显示初始化。这里有两种初始化方式,一种是在变量声明的时候初始化;第二种方法是在声明变量的时候不赋初值,但是要在这个变量所在的类的所有的构造函数中对这个变量赋初值。

       当final修饰一个 基本数据类型 时,表示该基本数据类型的值一旦在初始化后,值 便不能发生变化;如果final修饰一个 引用类型 时,则在对其初始化之后便不能再让其指向其他对象了(即 引用数据类型不可变的是其引用),但该引用所指向的对象的 内容 是可以发生变化的。本质上是一回事,因为引用的地址是一个值,final要求值,即地址的值不发生变化。

三。关于 final 的重要知识点

 3.1. final关键字可以用于成员变量、本地变量、方法以及类。

 3.2. final成员变量必须在声明的时候初始化或者在构造器中初始化或者调用this()初始化,否则就会报编译错误;没有在声明时初始化final变量的称为空白final变量(blank final variable)

 3.3. 不能够对final变量再次赋值,本地变量必须在声明时赋值。

 3.4. final方法 不能被 重写;final类 不能被 继承;final变量 不能被 修改

 3.5. 在 匿名类 中所有变量都必须是final变量。

 3.6. final关键字容易与finalize()方法搞混,后者是在Object类中定义的方法,是在垃圾回收之前被JVM调用的方法。

 3.7. 接口中声明的所有变量本身是final的。

 3.8. final 和 abstract 这两个关键字是反相关的,final类就 不 可能是abstract的。

 3.9. final方法在编译阶段绑定,称为静态绑定(static binding)。

 3.10. 将类、方法、变量声明为final能够提高性能,这样JVM就有机会进行估计,然后优化。

 3.11. 按照Java代码惯例,final变量就是常量,而且通常常量名要大写。

 3.12. 局部内部类和匿名内部类只能访问局部final变量。

 3.13. final的作用是用来保证变量不可变,而static作用于成员变量用来表示只保存一份副本。

 3.14. static final用来修饰成员变量和成员方法,可简单理解为“全局常量”。

 3.15. 对于集合对象声明为final指的是引用不能被更改,但是你可以向其中增加,删除或者改变内容。如:

   

   private final List list = new ArrayList();
   list.add(“home ”);      //valid
   list = new Vector();       //not valid







  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值