从源码学习final的使用

从源码学习final的使用

final的作用

​ final字面意思,意为最终的、不可变的。在Java中,final可以用来修饰类、方法和变量,可以分别起到不同的作用。

  1. final修饰类:表示该类不可以被继承;
  2. final修饰方法:表示该方法不能被子类重写;
  3. final修饰变量:表示该变量一旦被赋值后,其值不可被修改;

​ 上面的概念我们都很清楚,那具体到应用场景,有该如何使用呢?下面集合JDK的源码,看看final在源码中的使用;

final修饰类

​ final修饰类的主要应用场景是为了阻止类的继承。当我们希望某个类不能被其他类所继承时,就可以使用final修饰该类。

​ 需要注意的是,final修饰类只能阻止类的继承,对于类中的属性和方法,可以根据需要使用final修饰来决定是否允许修改。

在这里插入图片描述

​ 如上图中的String类,就被设计成了final类,可以看到它没有任何派生子类,这正是final关键字的效果。

对于一些不可变的类,比如String类,我们希望其不被修改,可以使用final修饰该类,确保其不被继承和修改

​ 需要注意的是,将类设计为final类需要权衡设计的灵活性和扩展性。如果在将来可能需要对该类进行修改或者扩展,将其设计为final类可能会限制其可扩展性。因此,设计时需要根据具体需求和设计目标来决定是否将类设计为final类。

final修饰方法

​ final修饰方法,可以防止方法被子类重写。从而确保方法的逻辑和实现不会被修改,以保证代码的安全性和稳定性。

在这里插入图片描述

​ 如HashMap中的removeNode方法,就是final修饰的。我们可以看到它是没有任何子类重写的。

​ 那么用final修饰方法,有哪些场景可以考虑呢?

  1. 安全性:通过将方法声明为final,防止子类重写该方法,确保方法的逻辑和实现不会被修改。
  2. 性能优化:final方法在编译时会被直接绑定到调用的地方,而不是在运行时进行动态绑定,这样可以提高方法的执行效率,减少方法的调用开销。

​ 需要注意,final修饰方法并不是必要的,只有在确有需要限制方法覆盖或提高性能等情况下才使用。在一般情况下,不需要过度使用final修饰方法。

final修饰变量

​ final修饰变量,表示其值不可变化。

​ 当变量时基本数据类型时,表示一旦被赋值,则变量值不会再变化;

​ 当变量是引用数据类型时,表示一旦被绑定某个对象,则无法再重新绑定其他对象,但是对象的属性是可以变化的。

​ final用来修饰变量,在源码中还是很常见的:

  1. 可以修饰类静态常量;

    在这里插入图片描述

  2. 可以修饰不可变变量;

    在这里插入图片描述

  3. 可以修饰方法的入参;

    在这里插入图片描述

​ final用来修饰变量一般有如下场景:

  1. 实现不可变性:将一个变量声明为final,意味着该变量的值不能被修改。这在需要保证对象的状态不可变时非常有用,例如在多线程环境下,可以避免线程安全问题。

  2. 性能优化:final变量在编译时会被直接替换为对应的值,而不是在运行时进行计算。这样可以减少运行时的计算开销,提高程序的性能。

  3. 常量定义:使用final修饰的变量通常被视为常量,命名时常使用全大写。这样也可以提高代码的可读性。

的计算开销,提高程序的性能。

  1. 常量定义:使用final修饰的变量通常被视为常量,命名时常使用全大写。这样也可以提高代码的可读性。

相关推荐

  1. final, finally, finalize区别

    2024-02-09 12:54:02       30 阅读
  2. C#面:final ,finallyfinalize 区别

    2024-02-09 12:54:02       32 阅读
  3. SPI协议学习PX4

    2024-02-09 12:54:02       22 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-09 12:54:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-09 12:54:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-09 12:54:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-09 12:54:02       20 阅读

热门阅读

  1. 寒假作业7

    2024-02-09 12:54:02       30 阅读
  2. Ubuntu 1804 And Above Coredump Settings

    2024-02-09 12:54:02       33 阅读
  3. 【Redis笔记】分布式锁及4种常见实现方法

    2024-02-09 12:54:02       33 阅读
  4. Rust入门2——随机数

    2024-02-09 12:54:02       33 阅读
  5. json模块(高维数据的存储与读取)

    2024-02-09 12:54:02       26 阅读
  6. Rust中的 Cell 和 RefCell

    2024-02-09 12:54:02       29 阅读
  7. 509. 斐波那契数

    2024-02-09 12:54:02       33 阅读
  8. 【Golang】定时任务Cron指南-毫秒级任务支持

    2024-02-09 12:54:02       34 阅读
  9. Flutter typedef 函数类型

    2024-02-09 12:54:02       32 阅读
  10. 速盾:dns解析和cdn加速的区别与联系

    2024-02-09 12:54:02       36 阅读