[java]final关键字的几种用法

2023-05-16

在java的关键字中,staticfinal是两个我们必须掌握的关键字。不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构。下面我们来了解一下final关键字及其用法。

final关键字

在java中,final的含义在不同的场景下有细微的差别,但总体上来说,它指的是“这是不可变的”。下面,我们来讲final的四种主要用法。

1.修饰数据

在编写程序时,我们经常需要说明一个数据是不可变的,我们成为常量。在java中,用final关键字修饰的变量,只能进行一次赋值操作,并且在生存期内不可以改变它的值。更重要的是,final会告诉编译器,这个数据是不会修改的,那么编译器就可能会在编译时期就对该数据进行替换甚至执行计算,这样可以对我们的程序起到一点优化。不过在针对基本类型和引用类型时,final关键字的效果存在细微差别。我们来看下面的例子:


 1 class Value {
 2     int v;
 3     public Value(int v) {
 4         this.v = v;
 5     }
 6 }
 7 
 8 public class FinalTest {
 9     
10     final int f1 = 1;
11     final int f2;
12     public FinalTest() {
13         f2 = 2;
14     }
15 
16     public static void main(String[] args) {
17         final int value1 = 1;
18         // value1 = 4;
19         final double value2;
20         value2 = 2.0;
21         final Value value3 = new Value(1);
22         value3.v = 4;
23     }
24 }  

上面的例子中,我们先来看一下main方法中的几个final修饰的数据,在给value1赋初始值之后,我们无法再对value1的值进行修改,final关键字起到了常量的作用。从value2我们可以看到,final修饰的变量可以不在声明时赋值,即可以先声明,后赋值。value3时一个引用变量,这里我们可以看到final修饰引用变量时,只是限定了引用变量的引用不可改变,即不能将value3再次引用另一个Value对象,但是引用的对象的值是可以改变的,从内存模型中我们看的更加清晰:

上图中,final修饰的值用粗线条的边框表示它的值是不可改变的,我们知道引用变量的值实际上是它所引用的对象的地址,也就是说该地址的值是不可改变的,从而说明了为什么引用变量不可以改变引用对象。而实际引用的对象实际上是不受final关键字的影响的,所以它的值是可以改变的。

另一方面,我们看到了用final修饰成员变量时的细微差别,因为final修饰的数据的值是不可改变的,所以我们必须确保在使用前就已经对成员变量赋值了。因此对于final修饰的成员变量,我们有且只有两个地方可以给它赋值,一个是声明该成员时赋值,另一个是在构造方法中赋值,在这两个地方我们必须给它们赋初始值。

最后我们需要注意的一点是,同时使用static和final修饰的成员在内存中只占据一段不能改变的存储空间。

2.修饰方法参数

前面我们可以看到,如果变量是我们自己创建的,那么使用final修饰表示我们只会给它赋值一次且不会改变变量的值。那么如果变量是作为参数传入的,我们怎么保证它的值不会改变呢?这就用到了final的第二种用法,即在我们编写方法时,可以在参数前面添加final关键字,它表示在整个方法中,我们不会(实际上是不能)改变参数的值:


public class FinalTest {

    /* ... */

    public void finalFunc(final int i, final Value value) {
        // i = 5; 不能改变i的值
        // v = new Value(); 不能改变v的值
        value.v = 5; // 可以改变引用对象的值
    }
}  

3.修饰方法

第三种方式,即用final关键字修饰方法,它表示该方法不能被覆盖。这种使用方式主要是从设计的角度考虑,即明确告诉其他可能会继承该类的程序员,不希望他们去覆盖这个方法。这种方式我们很容易理解,然而,关于private和final关键字还有一点联系,这就是类中所有的private方法都隐式地指定为是final的,由于无法在类外使用private方法,所以也就无法覆盖它。

4.修饰类

了解了final关键字的其他用法,我们很容易可以想到使用final关键字修饰类的作用,那就是用final修饰的类是无法被继承的。

上面我们讲解了final的四种用法,然而,对于第三种和第四种用法,我们却甚少使用。这不是没有道理的,从final的设计来讲,这两种用法甚至可以说是鸡肋,因为对于开发人员来讲,如果我们写的类被继承的越多,就说明我们写的类越有价值,越成功。即使是从设计的角度来讲,也没有必要将一个类设计为不可继承的。Java标准库就是一个很好的反例,特别是Java 1.0/1.1中Vector类被如此广泛的运用,如果所有的方法均未被指定为final的话,它可能会更加有用。如此有用的类,我们很容易想到去继承和重写他们,然而,由于final的作用,导致我们对Vector类的扩展受到了一些阻碍,导致了Vector并没有完全发挥它应有的全部价值。

总结

final关键字是我们经常使用的关键字之一,它的用法有很多,但是并不是每一种用法都值得我们去广泛使用。它的主要用法有以下四种:

  1. 用来修饰数据,包括成员变量和局部变量,该变量只能被赋值一次且它的值无法被改变。对于成员变量来讲,我们必须在声明时或者构造方法中对它赋值;
  2. 用来修饰方法参数,表示在变量的生存期中它的值不能被改变;
  3. 修饰方法,表示该方法无法被重写;
  4. 修饰类,表示该类无法被继承。

上面的四种方法中,第三种和第四种方法需要谨慎使用,因为在大多数情况下,如果是仅仅为了一点设计上的考虑,我们并不需要使用final来修饰方法和类。

转载于:https://www.cnblogs.com/dotgua/p/6357951.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[java]final关键字的几种用法 的相关文章

  • 基于数据报(UDP)编程的接口总结

    文章目录 Udp编程接口socket 创建套接字bind 将套接字绑定到指定的网络地址本机字节序和网络字节序 recvfrom 接收一个数据报并保存源地址 从数据报套接字接收数据调用格式函数功能 sendto 按照指定目的地向数据报套接字发
  • Android-自定义View集合

    学习安卓几个月了 xff0c 也有点自己的体会 xff0c 然而我发现自己真正喜欢的是数据方面的东西 xff0c 当然android自定义view也很好玩 xff0c 很体验一些技巧性的东西 也不想自己以前学习过程总结的东西就此淹没 xff
  • Nginx同一端口部署多个vue项目

    场景 大家在部署项目的时候会遇到 xff0c 只申请了一个公网端口 xff0c 但是需要将多个前端vue项目部署到同一域名同一端口下 xff0c 下面记录一下vue打包时如何配置以及nginx如何配置 我们这个项目有多个vue工程 xff0
  • 树莓派3B安装Ubuntu Mate18.04版

    树莓派3B为什么要装Ubuntu Mate版本 xff0c 因为轻量化 xff0c 就这么简单 1 相关器材 树莓派 xff1a Raspberry PI 3 Model B 树莓派3 microSD卡 闪迪16GB存储卡 HDMI线 读卡
  • 谷歌浏览器提示您的连接不是私密连接的解决方法

    谷歌浏览器是一款非常好用的网络浏览器 xff0c 但是最近有用户反应 xff0c 使用谷歌浏览器时出现提示 xff1a 您的连接不是私密连接 xff0c 这是怎么回事呢 xff1f 接下来就为大家分享使用谷歌浏览器过程中提示您的连接不是私密
  • ElasticSearch7索引管理--别名(基于kibana)

    ElasticSearch可以对一个或者多个索引指定别名 xff0c 通过别名可以查询到一个或者多个索引的内容 在内部ElasticSearch会自动把别名映射到相应的索引上 可以对别名编写过滤器或者路由 xff0c 在系统中别名不能重复
  • matlab粒子群优化算法路径规划代码解读

    前言 粒子群算法是一种群智能优化算法 xff0c 该算法具有原理简单 易实现 控制参数较少等优点 xff0c 下面根据Yarpiz公司的matlab代码就其在路径规划中的应用进行简单的介绍 xff0c 以供读者更好的理解粒子群优化算法的实际
  • (转载)OpenWrt下把SD卡挂载到 /overlay ,扩大软件空间

    在wall内外搜索无数文章 xff0c 唯有这篇文章能够看得懂并奏效 xff0c 感谢作者 原文地址 xff1a https blog samnya cn mount sd card to overlay on openwrt 作者 xff
  • XTW100高速编程器WIN10驱动安装

    按照以下方法可以实现XTW100在WIN10系统下的驱动安装 xff0c 且不需禁用驱动强制签名 先去这个网站 xff1a https zadig akeo ie 下载这个软件件 xff1a zadig 2 5 exe 由于你懂的原因 xf
  • ffmpeg-python库的使用翻译(一)

    原文地址 xff1a https github com kkroening ffmpeg python xff0c 本文为google翻译 43 部分人工翻译 希望能对大家有用 ffmpeg python xff1a FFmpeg的Pyth
  • ffmpeg-python库的使用翻译(二)

    接上篇 ffmpeg python库的使用翻译 xff08 一 xff09 原文 xff1a https github com kkroening ffmpeg python tree master examples assemble vi
  • ffmpeg-python库的使用翻译(三)

    接上篇 ffmpeg python库的使用翻译 xff08 二 xff09 原文地址 xff1a https github com kkroening ffmpeg python blob master ffmpeg filters py
  • C语言中,利用宏定义一个字符串和字符数组定义的字符串其末尾都会自动添加\0字符

    C语言中 xff0c 利用宏定义一个字符串 define MYPHONE 34 AT 43 CMGS 34 字符数组的方式来定义一个字符串unsigned char SMS 61 34 HELLO WELCOME TO RCCTS 34 问
  • 串口卡住问题分析与解决

    对于消息类系统而言任何阻塞都会导致整个系统的消息被卡住造成系统假死的问题 今天来说说串口导致系统卡死的问题 1 问题说明 xff1a 路由器在挂机过程中 xff0c 偶现串口卡住 xff0c web页面进不去 xff0c 有限终端拿不到地址
  • HTTPS 协议到底比 HTTP 协议多些什么?

    来源 xff1a 公众号 杰哥的IT之旅 作者 xff1a 阿拉斯加 ID xff1a Jake Internet 原文地址 xff1a HTTPS 协议到底比 HTTP 协议多些什么 xff1f 大家好 xff0c 我是杰哥 最近卷了一篇
  • Python爬虫实战 | 利用多线程爬取 LOL 高清壁纸

    来源 xff1a 公众号 杰哥的IT之旅 作者 xff1a 阿拉斯加 ID xff1a Jake Internet 如需获取本文完整代码及 LOL 壁纸 xff0c 请为本文右下角点赞并添加杰哥微信 xff1a Hc220088 获取 一
  • 拿来就用的脚本案例(三)

    大家好 xff0c 我是杰哥 xff08 鸽 xff09 之前给大家分享了 7 个非常实用的 Shell 拿来就用脚本实例 xff01 和 超硬核 xff01 11 个非常实用的 Python 和 Shell 拿来就用脚本实例 xff01
  • 应用层和驱动层的同步与异步的处理逻辑及底层实现

    应用层的实现 xff1a 1 ReadFile WriteFile DeviceIoControl等 xff0c 这些都有两种操作方式 xff0c 一种是同步 xff0c 一种是异步 操作设备的Win32API主要是这3个函数ReadFil
  • 10 款你不知道的 Linux 环境下的替代工具

    作者 xff1a JackTian 来源 xff1a 公众号 杰哥的IT之旅 ID xff1a Jake Internet 转载请联系授权 xff08 微信ID xff1a Hc220088 xff09 原文地址 xff1a 10 款你不知
  • 5 款可替代 du 命令的工具

    作者 xff1a JackTian 来源 xff1a 公众号 杰哥的IT之旅 ID xff1a Jake Internet 转载请联系授权 xff08 微信ID xff1a Hc220088 xff09 原文地址 xff1a 5 款可替代

随机推荐

  • 再见 Typora,这个开源的 Markdown 编辑器爱了。

    大家好 xff0c 我是杰哥 早期我刚开始写文章的时候 xff0c 用的富文本编辑器 xff0c 排版也非常的繁琐 xff0c 现在回想起来当初的 blog 用富文本编辑器写出来的感觉看上去真是不太美观 xff0c 直到我慢慢接触新事物后
  • 在线运行 Linux,真滴牛逼。

    作者 xff1a JackTian 来源 xff1a 公众号 杰哥的IT之旅 ID xff1a Jake Internet 转载请联系授权 xff08 微信ID xff1a Hc220088 xff09 原文地址 xff1a 在线运行 Li
  • 我的 2021 年终总结

    作者 xff1a JackTian 来源 xff1a 公众号 杰哥的IT之旅 原文链接 xff1a 我的 2021 年终总结 大家好 xff0c 我是杰哥 眨眼间到了 2022 年 xff0c 按照 2020 年的安排其实是要如期进行关于自
  • 11 款可替代 top 命令的工具

    作者 xff1a JackTian 来源 xff1a 公众号 杰哥的IT之旅 ID xff1a Jake Internet 转载请联系授权 xff08 微信ID xff1a Hc220088 xff09 原文地址 xff1a 11 款可替代
  • 7 款可替代 top 命令的工具

    作者 xff1a JackTian 来源 xff1a 公众号 杰哥的IT之旅 ID xff1a Jake Internet 转载请联系授权 xff08 微信ID xff1a Hc220088 xff09 原文地址 xff1a 7 款可替代
  • 14 款命令行常用工具的替代品

    作者 xff1a JackTian 来源 xff1a 公众号 杰哥的IT之旅 ID xff1a Jake Internet 转载请联系授权 xff08 微信ID xff1a Hc220088 xff09 原文地址 xff1a 14 款命令行
  • 再见 Xshell,这个开源的终端工具更酷炫。

    作者 xff1a JackTian 来源 xff1a 公众号 杰哥的IT之旅 ID xff1a Jake Internet 转载请联系授权 xff08 微信ID xff1a Hc220088 xff09 原文地址 xff1a 再见 Xshe
  • 太强了,这款开源终端工具可查询 IP 信息 ...

    作者 xff1a JackTian 来源 xff1a 公众号 杰哥的IT之旅 ID xff1a Jake Internet 转载请联系授权 xff08 微信ID xff1a Hc220088 xff09 原文地址 xff1a 太强了 xff
  • python排序算法——归并排序(附代码)

    python排序算法 归并排序 文章目录 python排序算法 归并排序一 前言二 算法描述三 代码实现总结 一 前言 相关知识来自 python算法设计与分析 初级排序算法是指几种较为基础且容易理解的排序算法 初级排序算法包括插入排序 选
  • 一次服务器非法重启后导致的故障排查记录

    作者 xff1a JackTian 来源 xff1a 公众号 杰哥的IT之旅 ID xff1a Jake Internet 转载请联系授权 xff08 微信ID xff1a Hc220088 xff09 原文地址 xff1a 一次服务器非法
  • 写了个自动巡检多个接口地址的脚本!

    作者 xff1a JackTian 来源 xff1a 公众号 杰哥的IT之旅 ID xff1a Jake Internet 转载请联系授权 xff08 微信ID xff1a Hc220088 xff09 原文链接 xff1a 写了个自动巡检
  • 写了个监控 ElasticSearch 进程异常的脚本!

    作者 xff1a JackTian 来源 xff1a 公众号 杰哥的IT之旅 ID xff1a Jake Internet 链接 xff1a 写了个监控 ElasticSearch 进程异常的脚本 xff01 服务器配置免密钥环境准备 xf
  • 太强了!这款命令行工具可以在 Linux 文件目录快速自动跳转

    作者 xff1a JackTian 来源 xff1a 公众号 杰哥的IT之旅 ID xff1a Jake Internet 链接 xff1a 太强了 xff01 这款命令行工具可以在 Linux 文件目录快速自动跳转 在 Linux 终端下
  • 又一个基于 GPT-4 编写、解释代码的工具,诞生了!

    作者 xff1a JackTian 来源 xff1a 公众号 杰哥的IT之旅 ID xff1a Jake Internet 链接 xff1a 又一个基于 GPT 4 编写 解释代码的工具 xff0c 诞生了 xff01 上周 xff0c O
  • 这款文件传输工具的替代品,牛逼了!

    作者 xff1a JackTian 来源 xff1a 公众号 杰哥的IT之旅 ID xff1a Jake Internet 链接 xff1a 这款文件传输工具的替代品 xff0c 牛逼了 xff01 某种场景下 xff0c 考虑到 LapT
  • 这款轻量级可视化路由追踪的神器,太强了!

    作者 xff1a JackTian 来源 xff1a 公众号 杰哥的IT之旅 ID xff1a Jake Internet 链接 xff1a 这款轻量级可视化路由追踪的神器 xff0c 太强了 xff01 在 Linux 环境下 xff0c
  • 【原创】树莓派4B + VSCode + MAVSDK-Python + PX4环境搭建

    一 前言 为了在树莓派下开发机载计算机相关功能 xff0c 通过MAVSDK与PX4进行通讯需要搭建相关环境 以往都是东拼西凑最后成功编译运行 xff0c 但过一段时间就得重新来过 xff0c 年龄大了不能老这么折腾 xff0c 这次记录一
  • 【Yolo】YoloV5训练自定义模型

    Yolo Jetson Orin Nano下部署 YoloV5 上一篇博文主要记录了在Jetson Orin Nano下部署YoloV5环境 xff0c 并运行了yoloV5n pt模型 xff0c 本篇在上一篇的基础上 xff0c 进一步
  • ModSim基本使用(Modbus模拟器)

    ModSim下载地址 打开软件 1 模拟modbus tcp 创建Modbus TCP连接 设置连接端口 xff0c 默认502 xff0c 点击 OK 就自动创建 新建 新建界面如下 xff08 可新建多个界面 xff0c 同时模拟500
  • [java]final关键字的几种用法

    在java的关键字中 xff0c static和final是两个我们必须掌握的关键字 不同于其他关键字 xff0c 他们都有多种用法 xff0c 而且在一定环境下使用 xff0c 可以提高程序的运行性能 xff0c 优化程序的结构 下面我们