从源码学习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实例,一个用于处理连…

Educational Codeforces Round 1(远古edu计划)

A. 高斯求和&#xff0c;如果2次幂小于n就减2次 #include<bits/stdc.h> #define INF 1e9 using namespace std; typedef long long ll; const int N2e59; int a[N]; int f[N],vis[N]; ll sn(ll a1,ll an,ll num){return (a1an)*num/2;} void init(){f[1]1;for(int i2;i…

【Linux】内核中的链表

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

Android 9.0 禁用adb install 安装app功能

1.前言 在9.0的系统产品定制化开发中,在进行一些定制开发中,对于一些app需要通过属性来控制禁止安装,比如adb install也不允许安装,所以就需要 熟悉adb install的安装流程,然后来禁用adb install安装功能,接下来分析下adb 下的安装流程 2.禁用adb install 安装app功能的…

1. pick gtk dll 程序的制作

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

unity显示图片

目录 创建c#脚本 自己创建gui组件&#xff1a; 入门教程&#xff1a; 读取图片&#xff1a; Unity读取图片并显示到UI中 显示双目相机&#xff0c;可以跑通 unity3d显示图片 参考教程&#xff0c;GameObject Unity UGUI的Image&#xff08;图片&#xff09;组件的介绍及…

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

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

Day45- 动态规划part13

一、最长递增子序列 题目一&#xff1a;300. 最长递增子序列​​​​​​​ ​​​​​​​300. 最长递增子序列 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数…

Java中的IO介绍

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

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

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

算法刷题框架

前言&#xff1a;最近积累了一些算法题量&#xff0c;正在刷东神的算法笔记&#xff0c;监督自己记录下读后启发&#xff0c;顺便帮助道友们阅读 数据结构 这一部分老生常谈&#xff0c;数据的存储方式只有顺序存储和链式存储。 最基本的数组和链表对应这两者&#xff0c;栈…

常见的单片机及其功能

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

放大器设计

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

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

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

C# 线程与线程池的使用方法、注意事项

在C#中&#xff0c;线程和线程池是两种用于实现多线程编程的方式。线程用于执行并发任务&#xff0c;而线程池提供了一种更有效率的方式来管理和复用线程资源。 C# 线程&#xff08;System.Threading.Thread&#xff09; 创建和启动线程&#xff1a; Thread thread new Thre…

AI算法工程师-非leetcode题目总结

AI算法工程师-非leetcode题目总结 除了Leetcode你还需要这些实现nms旋转矩形IOU手动实现BN手动实现CONV实现CrossEntropyLoss 除了Leetcode你还需要这些 希望大家留言&#xff0c;我可以进行补充。持续更新~~~ 实现nms import numpy as np def nms(dets, threshold):x1 dets…

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

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

通过容器化释放云的力量

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

「深度学习」dropout 技术

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

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

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