自我经历
在早晨面试官询问final在java中有什么作用时,我当时脑子一片空白,只能挤出一句,弄完修饰变量吧。看着面试官点了点头,但眉头却微微一皱,我就知道完了。
今天咱们就从头到尾搞清楚final的所有用途。当你下次遇到这个。问题自信到能现场开课,什么是final,简单来说,final是java中的一个关键字,表示不可变性,它可以用来修饰变量、方法和类,每种情况下都有不同的作用,让我们逐一拆解,看看final的真面目吧。
final修饰变量
修饰基本数据类型
场景:你写了一段代码,定义了一些常量,比如圆周率π,这样PI的局就再也不能被修改。如果你尝试重新赋值,这就是final的威力保证了数据的不可变性。常量用法在开发中很常见,特别是那些一旦设定就不会变的值,比如配置信息,数学常量等。
修饰引用数据类型
场景修饰一个对象引用并用发动修饰引用类型时,对象的引用不可变,但对象本身可以变,虽然听起来有点绕,但是记住此例子list这个引用永远指向同一个对象,但这个对象里的内容是可以修改的。
final修饰方法
场景:你写了一个方法,特别想确保此类不能随便修改它的逻辑。为什么用final修饰方法,安全性:一些方法可能对类的核心功能至关重要,比如加密算法的实现重写可能导致安全问题。
性能优化
JVM可以对final方法进行优化,比如内联调用减少方法调用的开销。final修饰类,场景:你写了一个类,希望它的设计在任何情况下都保持不变。用final修饰类时,它就不能被继承了。
final修饰类
为什么用final修饰类,确保类的不可变性。比如Java中的String类,就是final的,防止继承后破坏它的特性。
设计意图:有些类是为了提供工具方法的。比如java,lang,Math没有必要让别人继承,和static、abstract一起用的特殊情况。
final和static:
如果一个变量计时final又是static,它就成为了全局常量。这种写法常用在定义配置上,比如MAX_VALUE,整个应用程序都可以直接使用。
final和abstract:
你可能会问多项方法可以用发弄修饰吗,答案是不能。抽象方法要求子类必须重写,而final则不允许重写,这两者是互斥的。
final的实际应用场景
看完理论知识,咱们来聊聊实际开发中final的常见用途,
定义常量:
比如某个系统的日志级别配置。
实现不可变类:
Java中的String类就是最经典的例子,不可变类在多线程环境下,特别有用,避免了修改带来的线程安全问题。
防止方法被滥用重写:
如果你的代码中有一些关键逻辑,比如银行账户的转账方法就可以使用final来保护。
传递安全的参数:
当一个方法不希望某个参数被修改时,可以用final修饰,这样可以明确表达方法的设计意图,增加代码的可读性。
面试问答汇总
final关键字的作用是什么?
保证不可变性。修饰变量时值不能修改,修饰方法时不能重写,修饰类时不能继承。
final修饰对象引用时能修改对象的内容吗?
能。final只限制引用,不能重新指向新的对象。
为什么String是final的?
为了保证不可变性提升性能,且便于多线程安全操作。
final和static一起用有什么作用?
定义全局常量。
END:面试官问你final有什么用时,不要在只是简单地说,用来修饰变量了,从修饰变量方法到位,从实际应用场景到原理优化。今天的这篇文章完全可以让你自信,面对各种刁钻问题。想了解更多java面试技巧,记得关注我。欢迎关注微信公众号软件求生,获取更多技术干货。