关于Java编程,你知道吗?final的几种用法

开发 后端
今天我们重点谈谈final,多年的面试经验告诉我,很多人其实失分就是在final上,而非另外两者。final可以用来修饰类、方法、变量,分别有不同的意义。

[[243370]]

 “谈谈final、finally、finalize有什么不同?”

这是个非常经典的问题。

finally是Java保证重点代码一定要被执行的一种机制。

finalize是基础类java.lang.Object的一个方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收。

今天我们重点谈谈final,多年的面试经验告诉我,很多人其实失分就是在final上,而非另外两者。final可以用来修饰类、方法、变量,分别有不同的意义。

1.final修饰的class代表不可被继承扩展;

2.final修改的方法表示不可被重写(override);

3.final修饰的变量是不可被修改的。

如果你能够给出上面的回答,至少及格了。但是这样的回答隐藏掉了很多信息,这里真正有变化的是当final修饰变量的时候。

首先,以上叙述还不够准确,精确地说“final修饰的变量一旦被赋值将不可被修改”。

请看如下代码:

  1. public class MyClass { 
  2. public MyClass(int foo) { 
  3. this.foo = foo; 
  4. private final foo; 

在这段代码中类MyClass的成员变量foo被修饰为final,但并没有对其赋值,而是在构造函数中为其指定的取值。

当然你不能就此认为“final修饰的变量是不可被修改的”说法错误,但至少没有表达出这层意思。

其实Java语言这样设计是有道理的,利用这一特性可以达到这样的目的:当我们发明一个类的时候,有时会发现有一些需要外部传入的参数,我们希望一旦被确定后,在对象被销毁之前不希望其被改变。遇到这种情况,我们就可以将这些参数定义为final的成员变量,然后外界只能够通过构造函数的参数指定。

final是否可以用来修饰函数参数或者内部变量?

答案是肯定的。事实上这种行为是被推荐的,因为这样可以确保变量不会被意外修改。而且被final修饰过的变量与参数还可以被传递给匿名类,例如:

关于Java编程,你知道吗?final的几种用法

 

Java在实现内部类时,实际会拷贝一份,不是去直接使用局部变量,final在这里可以防止出现数据一致性的问题。

外界有很多文章或者数据中还会介绍,final也许会有性能的好处。

比如,利用final可能有助于JVM将方法进行内联,可以改善编译器进行条件编译的能力等等。

坦白说,很多类似的结论都是基于假设得出的,比如现在高性能JVM(如HotSpot)判断内联未必依赖final的提示,要相信JVM还是非常智能的。

类似的,final变量对性能的影响,大部分情况下,并没有考虑的必要。不要指望这样的小技巧带来所谓的性能好处。相反,使用final更重要的理由,应该是为提高代码可读性,防止变量被意外修改。

***还要强调,final虽然会带来不可变的效果,但并不意味着任何情况下都是如此。比如final修饰java.util.List类型的变量,并不会防止列表内容被修改。实际的效果是防止变量指向的List对象不会被再次创建。而如果你需要的是一个不允许修改的List,则可以使用Collections.unmodifiableList()得到。

责任编辑:武晓燕 来源: 今日头条
相关推荐

2024-02-05 12:08:07

线程方式管理

2019-01-07 13:01:08

Linux惊叹用法命令

2020-02-20 08:30:49

OSPF网络协议路由协议

2022-01-26 22:14:59

HiveSQLSQL脚本

2022-09-20 14:11:37

JVM调优命令

2021-09-19 22:53:48

5G4G手机

2023-12-12 08:41:01

2015-06-29 09:06:51

2018-04-27 14:40:18

Java语言程序

2021-05-07 16:19:36

异步编程Java线程

2021-03-19 18:13:21

手机内存软件

2016-03-18 19:03:35

认知计算IBM

2019-12-12 09:23:29

Hello World操作系统函数库

2022-03-10 08:25:27

JavaScrip变量作用域

2021-03-02 08:49:00

区块链比特币技术

2023-12-20 08:23:53

NIO组件非阻塞

2023-04-26 10:21:04

2015-07-03 11:20:41

编程学习方法

2020-09-28 11:14:57

线程数据语言

2023-08-29 09:31:01

Scrapy网页爬虫
点赞
收藏

51CTO技术栈公众号