面试题:用过final关键字吗?它有什么作用
面试考察点
考察目的: 了解面试者对Java基础知识的理解
考察人群: 工作1-5年,工作年限越高,对于基础知识理解的深度就越高。
好友添加:huany6880 加入资深Java学习交流圈,并有系统整理了一套java初学/进阶者最佳的学习方法以及路 线图大纲,Java各核心知识点、架构主流技术资料/源码以及最新大厂面试题定期更新!
背景知识
final
关键字大家都不陌生,但是要达到深度理解,还是欠缺了一些。我们从三个方面去理解final
关键字。
final
关键字的基本用法- 深度理解
final
关键字 final
关键字的内存屏障语义
final的基本用法
final
关键字,在Java中可以修饰类、方法、变量。
-
被final修饰的类,表示这个类不可被继承,final类中的成员变量可以根据需要设为final,并且final修饰的类中的所有成员方法都被隐式指定为final方法.
在使用final修饰类的时候,要注意谨慎选择,除非这个类真的在以后不会用来继承或者出于安全的考虑,尽量不要将类设计为final类。
public final class TClass { public final String test(){ return "true"; } } public class TCCClass extends TClass{ public static void main(String[] args) { } }
上述程序运行得到如下错误:
java: 无法从最终org.example.cl03.TClass进行继承
-
被final修饰的方法,表示该方法无法被重写.其中
private
方法会被隐式的指定为final
方法。class SuperClass{ protected final String getName() { return “supper class”; } @Override public String toString() { return getName(); } } classSubClass extends SuperClass{ protected String getName() { return “sub class”; } }
上述代码运行会得到如下错误:
java: org.example.cl03.TCCClass中的test()无法覆盖org.example.cl03.TClass中的test() 被覆盖的方法为final
-
被final修饰的成员变量是用得最多的地方。
- 对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;final修饰的变量能间接实现常量的功能,而常量是全局的、不可变的,因此我们同时使用static和final来修饰变量,就能达到定义常量的效果。
- 如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
被final修饰的变量的初始化#
-
在定义时初始化属性的值
public class TCCClass { private fi