Java 中 final 关键字的奥秘

目录

一、final 修饰类:封印的 “永恒之石”

二、final 修饰变量:锁定的 “不变之值”

三、final 修饰方法:不可撼动的 “坚固堡垒”

四、总结


在 Java 编程的世界里,final 关键字就像一把神奇的 “锁”,一旦使用,就能赋予类、变量和方法独特的性质。今天,就让我们一同深入探究 final 关键字修饰类、变量和方法时的各种表现和用途,通过丰富的代码示例,感受它为我们的编程带来的便利与保障。

一、final 修饰类:封印的 “永恒之石”

当 final 关键字修饰一个类时,这个类就如同被封印的 “永恒之石”,无法被其他类继承。这意味着该类的设计和功能已经固定,不希望被修改或扩展。在实际应用中,这样的类通常用于表示那些具有特定用途、不需要也不应该被改变的实体。

比如,Java 标准库中的String类就是一个被 final 修饰的类。String类用于处理字符串,它的内部实现已经非常完善,并且在各种场景下都被广泛使用。如果允许其他类继承String类,可能会破坏String类的一些特性和安全性。

下面我们通过自定义一个被 final 修饰的类来加深理解:

final class ImmutablePoint {private int x;private int y;public ImmutablePoint(int x, int y) {this.x = x;this.y = y;}public int getX() {return x;}public int getY() {return y;}
}

在这个例子中,ImmutablePoint类被 final 修饰,它表示一个不可变的点。由于不能被继承,我们可以确保这个类的行为和属性不会被意外修改。如果尝试创建一个继承自ImmutablePoint的类,将会导致编译错误:

// 以下代码会导致编译错误,因为ImmutablePoint类被final修饰,不能被继承
// class SubImmutablePoint extends ImmutablePoint {
//     // 类体
// }

final 修饰类在保证代码的稳定性和安全性方面具有重要意义,尤其在一些基础类库的设计中,能防止子类对核心功能的破坏。

二、final 修饰变量:锁定的 “不变之值”

  1. final 修饰基本数据类型变量
    当 final 修饰基本数据类型变量时,该变量就成为一个常量,一旦被赋值,其值就不能再被改变。这在很多场景下非常有用,比如定义数学常量、配置参数等。

public class MathConstants {public static final double PI = 3.141592653589793;public static final int E = 2.71828;public static void main(String[] args) {// 以下代码会导致编译错误,因为PI是final修饰的常量,不能被重新赋值// PI = 3.14;System.out.println("圆周率PI的值为: " + PI);System.out.println("自然常数E的值为: " + E);}
}

在这个例子中,PIE都是被 final 修饰的常量,它们的值在程序运行过程中始终保持不变。使用 final 修饰常量,不仅可以提高代码的可读性,还能避免因意外赋值导致的错误。
2. final 修饰引用数据类型变量
当 final 修饰引用数据类型变量时,它表示该变量的引用不能再指向其他对象,但对象本身的内容是可以修改的。这一点需要特别注意,与基本数据类型变量有所不同。

class MutableObject {private int value;public MutableObject(int value) {this.value = value;}public void setValue(int value) {this.value = value;}public int getValue() {return value;}
}public class FinalReferenceExample {public static void main(String[] args) {final MutableObject obj = new MutableObject(10);// 以下代码会导致编译错误,因为obj是final修饰的变量,不能再指向其他对象// obj = new MutableObject(20);obj.setValue(30);System.out.println("对象的值为: " + obj.getValue());}
}

在这个例子中,obj是一个被 final 修饰的引用变量,它只能指向创建时的MutableObject对象,不能再指向其他对象。但是,我们可以通过调用对象的方法修改对象内部的状态,如obj.setValue(30)

三、final 修饰方法:不可撼动的 “坚固堡垒”

当 final 修饰一个方法时,该方法就不能被其子类重写。这在设计类的方法时非常有用,如果你希望某个方法的实现是固定的,不希望子类对其进行修改,可以将该方法声明为 final。

class Animal {public final void makeSound() {System.out.println("动物发出声音");}
}class Dog extends Animal {// 以下代码会导致编译错误,因为makeSound方法在父类中被final修饰,不能被重写// @Override// public void makeSound() {//     System.out.println("汪汪汪");// }
}

在这个例子中,Animal类中的makeSound方法被 final 修饰,Dog类作为Animal类的子类,不能重写makeSound方法。这确保了在继承体系中,makeSound方法的行为始终保持一致。

final 修饰方法在很多情况下可以提高程序的安全性和稳定性。例如,在一些核心算法的实现中,将关键方法声明为 final,可以防止子类无意中修改算法逻辑,导致程序出现错误。

四、总结

通过以上对 final 关键字修饰类、变量和方法的深入探讨,我们可以看到 final 关键字在 Java 编程中扮演着重要的角色。它为我们提供了一种机制,能够确保类的设计、变量的值以及方法的实现保持稳定和不变。合理使用 final 关键字,可以使我们的代码更加健壮、安全和易于维护。在实际编程中,我们需要根据具体的业务需求和设计目标,灵活运用 final 关键字,发挥它的最大优势。希望大家在今后的 Java 编程中,能够熟练掌握和运用 final 关键字,创造出更加优秀的程序。如果在学习过程中遇到任何问题,欢迎随时与我交流,让我们一起在 Java 编程的道路上不断前行。

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

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

相关文章

Python运算符

1、算术运算符 加 减— 乘* 除/ 整除// 取余% 幂运算** 优先级: 第1级:** 第2级:* , / , % ,// 第3级; , - print("加", 1 4) print("减",8 - 19) p…

RTMP|RTSP播放器只解码视频关键帧功能探讨

技术背景 我们在做RTMP|RTSP直播播放器的时候,遇到过这样的技术诉求,在一些特定的应用场景中,可能只需要关键帧的信息,例如视频内容分析系统,可能只对关键帧进行分析,以提取特征、检测对象或场景变化。鉴于…

2024年度总结-CSDN

2024年CSDN年度总结 Author:OnceDay Date:2025年1月21日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 文章目录 2024年CSDN年度总结1. 整体回顾2…

【Node.js]

一、概述 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境 ,使用了一个事件驱动、非阻塞式I/O模型, 让JavaScript 运行在服务端的开发平台,它让JavaScript成为与PHP、Python、Perl、Ruby等服务端语言平起平坐的脚本语言。 官网地…

【基于无线电的数据通信链】Link 11 仿真测试

〇、废话 Link 11 仿真测试 涉及多个方面,包括信号仿真、协议模拟、数据链路层的仿真以及网络性能评估等。Link 11 是一种基于 HF(高频) 或 UHF(超高频) 波段的无线通信协议,主要用于军事通信系统中。为了…

iOS 网络请求: Alamofire 结合 ObjectMapper 实现自动解析

引言 在 iOS 开发中,网络请求是常见且致其重要的功能之一。从获取资料到上传数据,出色的网络请求框架能夠大大提升开发效率。 Alamofire 是一个极具人气的 Swift 网络请求框架,提供了便据的 API 以完成网络请求和响应处理。它支持多种请求类…

分布式多卡训练(DDP)踩坑

多卡训练最近在跑yolov10版本的RT-DETR,用来进行目标检测。 单卡训练语句(正常运行): python main.py多卡训练语句: 需要通过torch.distributed.launch来启动,一般是单节点,其中CUDA_VISIBLE…

RV1126+FFMPEG推流项目(8)AENC音频编码模块

本节分享的是AENC音频编码模块,是负责在AI模块通道里面取出收集到的音频数据,进行编码。了解AENC模块之前,先来看一个数据结构“RV1126_AENC_CONFIG”,这个数据结构是自己封装的,里面有AENC通道号,和内部描…

智能新浪潮:亚马逊云科技发布Amazon Nova模型

在2024亚马逊云科技re:Invent全球大会上,亚马逊云科技宣布推出新一代基础模型Amazon Nova,其隶属于Amazon Bedrock,这些模型精准切入不同领域,解锁多元业务可能,为人工智能领域带来革新。 带你认识一起了解Amazon Nova…

【Prometheus】PromQL进阶用法

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

C++《AVL树》

在之前的学习当中我们已经了解了二叉搜索树,并且我们知道二叉搜索树的查找效率是无法满足我们的要求,当二叉树为左或者右斜树查找的效率就很低下了,那么这本篇当中我们就要来学习对二叉搜索树进行优化的二叉树——AVL树。在此会先来了解AVL树…

微信小程序:实现单选,多选,通过变量控制单选/多选

一、实现单选功能 微信小程序提供了 radio 组件来实现单选功能。radio 组件需要配合 radio-group 使用。 1. WXML 代码 <radio-group bindchange"onRadioChange"><label wx:for"{{items}}" wx:key"id"><radio value"{{it…

《Effective Java》学习笔记——第1部分 创建对象和销毁对象的最佳实践

文章目录 第1部分 创建和销毁对象一、前言二、创建和销毁对象最佳实践内容1. 优先使用工厂方法而非直接使用构造器2. 避免创建不必要的对象3. 避免使用过多的构造器4. 避免使用原始类型&#xff08;Raw Types&#xff09;5. 避免创建对象的过度依赖6. 清理资源和关闭对象&#…

解决conda create速度过慢的问题

问题 构建了docker容器 想在容器中创建conda环境&#xff0c;但是conda create的时候速度一直很慢 解决办法 宿主机安装的是anaconda 能正常conda create,容器里安装的是miniforge conda create的时候速度一直很慢&#xff0c;因为容器和宿主机共享网络了&#xff0c;宿主机…

【知识分享】PCIe5.0 TxRx 电气设计参数汇总

目录 0 引言 1 参考时钟--Refclk 2 发射端通道设计 3 发送均衡技术 4 接收端通道设计 5 接收均衡技术 6 结语 7 参考文献 8 扩展阅读 0 引言 PCI Express Base Specification 5.0的电气规范中&#xff0c;关键技术要点如下&#xff1a; 1. 支持2.5、5.0、8.0、16.0和3…

Java 的初认识(一)

好久不见兄弟们&#xff01;之前更新完 C 语言的内容之后呢&#xff0c;我是做了一个“ 短暂 ”的休息昂&#xff0c;当然我自己的学习是没有停歇的&#xff0c;只是在更新博客这上面休息了一下&#xff0c;主要还是想让自己先把这部分的知识掌握透彻了之后&#xff0c;再来为大…

2024年美赛C题评委文章及O奖论文解读 | AI工具如何影响数学建模?从评委和O奖论文出发-O奖论文做对了什么?

模型假设仅仅是简单陈述吗&#xff1f;允许AI的使用是否降低了比赛难度&#xff1f;还在依赖机器学习的模型吗&#xff1f;处理题目的方法有哪些&#xff1f;O奖论文的优点在哪里&#xff1f; 本文调研了当年赛题的评委文章和O奖论文&#xff0c;这些问题都会在文章中一一解答…

C语言练习(17)

两个乒乓球队进行比赛&#xff0c;各出3人。甲队为A、B、C 3人&#xff0c;乙队为X、Y、Z 3人&#xff0c;并抽签决定比赛名单。有人向队员打听比赛的名单&#xff0c;A说他不和X比&#xff0c;C说他不和X、Z比&#xff0c;请编程序找出3对选手的对阵名单。 #include <stdi…

【回忆迷宫——处理方法+DFS】

题目 代码 #include <bits/stdc.h> using namespace std; const int N 250; int g[N][N]; bool vis[N][N]; int dx[4] {0, 0, -1, 1}; int dy[4] {-1, 1, 0, 0}; int nx 999, ny 999, mx, my; int x 101, y 101; //0墙 (1空地 2远方) bool jud(int x, int y) {if…

Flowable 审核功能封装

文章目录 引言I 查询当前用户需要审核的数据列表整体逻辑根据组获取任务数据根据审核人获取任务数据II 进行审核整体逻辑III 审核历史查询IV 流程图查看流程进度思路根据任务 ID 获取任务进度流程图引言 流程引擎功能封装 : 审核列表数据查询进行审核的整体逻辑:获取任务 Id,…