从源码学习final的使用
final的作用
final字面意思,意为最终的、不可变的。在Java中,final可以用来修饰类、方法和变量,可以分别起到不同的作用。
- final修饰类:表示该类不可以被继承;
- final修饰方法:表示该方法不能被子类重写;
- final修饰变量:表示该变量一旦被赋值后,其值不可被修改;
上面的概念我们都很清楚,那具体到应用场景,有该如何使用呢?下面集合JDK的源码,看看final在源码中的使用;
final修饰类
final修饰类的主要应用场景是为了阻止类的继承。当我们希望某个类不能被其他类所继承时,就可以使用final修饰该类。
需要注意的是,final修饰类只能阻止类的继承,对于类中的属性和方法,可以根据需要使用final修饰来决定是否允许修改。
如上图中的String类,就被设计成了final类,可以看到它没有任何派生子类,这正是final关键字的效果。
对于一些不可变的类,比如String类,我们希望其不被修改,可以使用final修饰该类,确保其不被继承和修改。
需要注意的是,将类设计为final类需要权衡设计的灵活性和扩展性。如果在将来可能需要对该类进行修改或者扩展,将其设计为final类可能会限制其可扩展性。因此,设计时需要根据具体需求和设计目标来决定是否将类设计为final类。
final修饰方法
final修饰方法,可以防止方法被子类重写。从而确保方法的逻辑和实现不会被修改,以保证代码的安全性和稳定性。
如HashMap中的removeNode方法,就是final修饰的。我们可以看到它是没有任何子类重写的。
那么用final修饰方法,有哪些场景可以考虑呢?
- 安全性:通过将方法声明为final,防止子类重写该方法,确保方法的逻辑和实现不会被修改。
- 性能优化:final方法在编译时会被直接绑定到调用的地方,而不是在运行时进行动态绑定,这样可以提高方法的执行效率,减少方法的调用开销。
需要注意,final修饰方法并不是必要的,只有在确有需要限制方法覆盖或提高性能等情况下才使用。在一般情况下,不需要过度使用final修饰方法。
final修饰变量
final修饰变量,表示其值不可变化。
当变量时基本数据类型时,表示一旦被赋值,则变量值不会再变化;
当变量是引用数据类型时,表示一旦被绑定某个对象,则无法再重新绑定其他对象,但是对象的属性是可以变化的。
final用来修饰变量,在源码中还是很常见的:
-
可以修饰类静态常量;
-
可以修饰不可变变量;
-
可以修饰方法的入参;
final用来修饰变量一般有如下场景:
-
实现不可变性:将一个变量声明为final,意味着该变量的值不能被修改。这在需要保证对象的状态不可变时非常有用,例如在多线程环境下,可以避免线程安全问题。
-
性能优化:final变量在编译时会被直接替换为对应的值,而不是在运行时进行计算。这样可以减少运行时的计算开销,提高程序的性能。
-
常量定义:使用final修饰的变量通常被视为常量,命名时常使用全大写。这样也可以提高代码的可读性。
的计算开销,提高程序的性能。
- 常量定义:使用final修饰的变量通常被视为常量,命名时常使用全大写。这样也可以提高代码的可读性。