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