从源码学习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修饰的变量通常被视为常量,命名时常使用全大写。这样也可以提高代码的可读性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/679934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Netty Review - NioEventLoopGroup源码解析

文章目录 概述类继承关系源码分析小结 概述 EventLoopGroup bossGroup new NioEventLoopGroup(1); EventLoopGroup workerGroup new NioEventLoopGroup();这段代码是在使用Netty框架时常见的用法,用于创建两个不同的EventLoopGroup实例,一个用于处理连…

【Linux】内核中的链表

🔥博客主页:PannLZ 🎋系列专栏:《Linux系统之路》 🥊不要让自己再留有遗憾,加油吧! 文章目录 链表1.创建和初始化2.创建节点3.添加节点4.删除节点5.遍历 链表 内核开发者只实现了循环双链表&am…

1. pick gtk dll 程序的制作

文章目录 前言预览细节要点初始窗口尺寸提示音快速提示信息对话框AlertDialog鼠标移入移出事件布局与父子控件关系图片 后续源码及资源 前言 在之前的打包测试中我提到了需要一个挑选dll的程序于是我打算用Gtk来制作这个程序 预览 细节要点 初始窗口尺寸 只有主窗口有set_d…

基于无线传感器网络的LC-DANSE波束形成算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1LC-DANSE算法原理 4.2 LCMV算法原理 5.完整程序 1.程序功能描述 在无线传感器网络中,通过MATLAB对比LC-DANSE波束形成算法和LCMV波束形成算法。对比SNR,mse等指标…

Java中的IO介绍

本章内容 一 、File概念 File可以代表一个目录或者一个文件,并不能代表文件的内容 文件和流的区别:File关注的是文件本身的特征,如名称、路径、修改时间、大小。 流关注的是文件的内容。 二、File基本的操作 常见构造方法 | File(String p…

以用户为中心,酷开科技荣获“消费者服务之星”

在企业顺应消费升级的道路中,企业自身不仅要着力强化对于消费者服务意识的提升,并且要树立诚信自律的行业示范带头作用,助力消费环境稳中向好,不断满足人民群众对美好生活的期待。企业的发展需要消费者的认可,酷开科技…

常见的单片机及其功能

在当今电子技术快速发展的时代,单片机作为核心组件,在各类电子项目和产品中扮演着至关重要的角色。它们的应用范围从简单的家用电器控制到复杂的工业自动化系统,几乎无处不在。接下来,我们将以轻松的语言,探讨几种广泛…

放大器设计

目录 简介单阶段放大器:低噪声放大器例题例题2例题3简介 放大器能够放大信号,是电路设计中不可或缺的一种重要软件。根据应用和结构的不同,可以将放大器分为三类。 小信号:设计目标是在输入输出匹配条件下,获取一个特定的传输增益,对输出信号的功率没有要求。低噪声:相…

Spring 如何解决循环依赖?Spring三级缓存

什么是循环依赖 说白是一个或多个对象实例之间存在直接或间接的依赖关系,这种依赖关系构成了构成一个环形调用。 自己依赖自己 两个对象间的依赖关系 多个对象间的依赖关系 Spring出现循环依赖的场景 单例的setter注入 Service public class A {Resourceprivate…

五(一)java高级-集合-集合与迭代器(二)

5.1.2 Iterator迭代器 1、Iterator 所谓迭代器:就是用于挨个访问集合元素的工具/对象 方法: boolean hasNext():判断当前遍历集合后面是否还有元素可以迭代Object next():取出当前元素,并往后移→noSuchelementExceptionvoid remove():删…

通过容器化释放云的力量

NCSC (英国国家网络安全中心) 经常被问到的一个问题是是否在云中使用容器。这是一个简单的问题,但答案非常微妙,因为容器化的使用方式有很多种,其中一些方法比其他方法效果更好。 今天,我们发布了有关使用容器化的安全指南&#…

「深度学习」dropout 技术

一、工作原理 1. 正则化网络 dropout 将遍历网络的每一层,并设置消除神经网络中节点的概率。 1. 每个节点保留/消除的概率为0.5: 2. 消除节点: 3. 得到一个规模更小的神经网络: 2. dropout 技术 最常用:反向随机失活 "…

锐捷(二十一)全局地址绑定

vlan划分和vlanif接口配置略,注意vlanif接口里要no shutdown配置如下: Address-bind 192.168.1.1 AAAA.BBBB.CCCCAddress-bind uplink g0/0Address-bind binding-filter loggingAddress-bind install 此时,IP为192.168.1.1 mac地址为AAAA.B…

『运维备忘录』之 Netstat 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等只是,甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作,持续给大家更新运维工作所需要接触到的知识点,希望大…

GaussDB HCS 轻量化部署软件下载指引

一、Support 账号准备 1. 账号说明 华为的软件服务在华为support网站发布,注册该账号后,可以申请软件、下载离线文档,查看技术案例等功能 2. 账号注册 步骤 1:点击如下官方链接 华为运营商技术支持 - 华为 步骤 2&#xff1…

kafka教程

Kafka 中,Producer采用push模型,而Consumer采用pull模型。 Topic Topic(主题)是消息的逻辑分类或通道。它是Kafka中用于组织和存储消息的基本单元。一个Topic可以被看作是一个消息发布的地方,生产者将消息发布到一个…

机器学习9-随机森林

随机森林(Random Forest)是一种集成学习方法,用于改善单一决策树的性能,通过在数据集上构建多个决策树并组合它们的预测结果。它属于一种被称为“集成学习”或“集成学习器”的机器学习范畴。 以下是随机森林的主要特点和原理&…

IT行业含金量高的证书-软考

软考全称计算机技术与软件专业技术资格(水平)考试,软考既是职业资格考试,又是职称资格考试。2021年12月2号发布新版的国家职业资格目录,软考是在计算机技术领域中的唯一的国家职业资格。 一、好处 软考是一个神奇又特…

【数据结构】14 队列(带头结点的链式存储和顺序存储实现)

定义 队列是一个有序线性表,但是队列的插入、删除操作是分别在线性表的两个不同端点进行的。 设一个队列 Q ( a 1 , a 2 , . . . , a n ) Q (a_1, a_2,...,a_n) Q(a1​,a2​,...,an​),那么 a 1 a_1 a1​被称为队头元素, a n a_n an​为队…

手把手教你开发Python桌面应用-PyQt6图书管理系统-图书信息修改实现

锋哥原创的PyQt6图书管理系统视频教程: PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…