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

 

posted @ 2020-11-23 18:25  停不下的时光  阅读(3001)  评论(0编辑  收藏  举报