final 关键字
Java 中的 String 类是一个 final 类。
一、final 关键字的基本用法
在 Java 中,final 关键字可以用来修饰类、方法、变量。
1. 修饰类
当用 final 修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用 final 进行修饰。final 类中的成员变量可以根据需要设计为 final,但是 final 类中的所有成员方法都会被隐式的指定为 final 方法。
所以,除非这个类在以后不会被用来继承或者处于安全的考虑,尽量不要将类设计成 final 类。
2. 修饰方法
“使用 final 方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的 Java 实现版本中,会将 final 方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的性能提升。在最近的 Java 版本中,不需要使用 final 方法进行这些优化了。”
所以,只有在想明确禁止该方法在子类中被覆盖的情况下才将方法设置为 final 的。
3. 修饰变量
修饰变量是 final 用的最多的地方。
对于一个 final 变量,如果是基本数据类型的变量,则其数值一旦在初始化后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
二、深入理解 final 关键字
1. 类的 final 变量和普通变量有什么区别?
当用 final 作用于类的成员变量时,成员变量必须在定义时或者构造器中进行初始化赋值,而且 final 变量一旦被初始化赋值之后,就不能再被赋值了。
当 final 变量是基本数据类型以及 String 类型时,如果在编译期间就能知道他的确切值,则编译器会把它当做编译期常量使用。也就是说在用到该 final 变量的地方,相当于直接访问这个常量,不需要在运行时确定。但是只有在编译期能确切知道 final 变量值的情况下,编译器才会进行这样的优化。
2. 被 final 修饰的引用变量指向的引用对象的内容可变吗?
可以
3. final 和 static
很多时候会容易吧 static 和 final 关键字混淆,static 作用于成员变量用来表示只保存一份副本,而 final 作用是用来保证变量不可变。
4. 关于 final 参数问题
“当你在方法中不需要改变作为参数的对象变量时,明确使用 final 进行声明,会防止你无意的修改而影响到调用方法外的变量” —— 这句话是不对的。
因为 java 参数传递是值传递,基本类型达不到这样的效果,引用类型可改变实例的内容,所以也不行
https://www.cnblogs.com/dolphin0520/p/3736238.html