【IT领域新生必看】解锁 `final` 关键字的秘密:Java 编程中的终极武器

文章目录

        • 引言
        • 什么是 `final` 关键字?
        • 一、 `final` 变量
          • `final` 局部变量
          • `final` 实例变量
          • `final` 静态变量
        • 二、 `final` 方法
        • 三、 `final` 类
        • 四、 `final` 关键字的实际应用
          • 1. 定义常量
          • 2. 防止方法被重写
          • 3. 创建不可变类
          • 4. 优化性能
        • 五、 `final` 的一些常见误区
          • 1. `final` 变量不能在构造方法中赋值
          • 2. `final` 类中的所有方法都是 `final` 的
          • 3. `final` 变量的引用不能改变
        • 结论

在这里插入图片描述

引言

在编程的世界里,关键字是语言设计者赋予开发者的强大工具,每个关键字都有其独特的用途和重要性。对于Java程序员来说,final 是一个极其重要且常用的关键字。它不仅有助于提高代码的安全性和稳定性,还能优化性能,帮助开发者编写更高效的代码。但是,final 关键字的用途和使用场景可能让初学者感到困惑。今天,我们将深入探讨Java中的 final 关键字,揭示它的真正威力,并展示如何在实际编程中巧妙地运用它。

什么是 final 关键字?

在Java中,final 是一个特殊的关键字,它可以用于变量、方法和类,表示它们不能被修改。具体来说:

  • final 变量:表示常量,一旦赋值就不能更改。
  • final 方法:表示该方法不能被子类重写。
  • final 类:表示该类不能被继承。
一、 final 变量

final 关键字用于变量时,它表示这个变量一旦被赋值,就不能再改变。这种变量通常被称为常量。

final 局部变量

局部变量是在方法、构造方法或块中声明的变量。当局部变量被声明为 final 时,它在赋值后就不能再被修改。

public class FinalExample {public void demonstrateFinalLocalVariable() {final int CONSTANT_VALUE = 10;System.out.println("Constant Value: " + CONSTANT_VALUE);// 下面的代码将会报错,因为 CONSTANT_VALUE 是 final 的,不能再被修改// CONSTANT_VALUE = 20;}public static void main(String[] args) {FinalExample example = new FinalExample();example.demonstrateFinalLocalVariable();}
}

在这个例子中,CONSTANT_VALUE 是一个 final 变量,赋值为10后不能再被修改。如果尝试重新赋值,编译器会报错。

final 实例变量

实例变量是属于对象的变量。当实例变量被声明为 final 时,它必须在对象初始化时赋值(即在构造方法中赋值),并且一旦赋值就不能再改变。

public class FinalExample {private final int id;public FinalExample(int id) {this.id = id;}public void showId() {System.out.println("ID: " + id);}public static void main(String[] args) {FinalExample example = new FinalExample(1);example.showId();// 下面的代码将会报错,因为 id 是 final 的,不能再被修改// example.id = 2;}
}

在这个例子中,id 是一个 final 实例变量,必须在构造方法中赋值,并且赋值后不能再被修改。

final 静态变量

静态变量是属于类的变量,当静态变量被声明为 final 时,它成为一个常量,必须在声明时或在静态初始化块中赋值,并且赋值后不能再改变。

public class FinalExample {public static final int MAX_VALUE = 100;public static void main(String[] args) {System.out.println("Max Value: " + MAX_VALUE);// 下面的代码将会报错,因为 MAX_VALUE 是 final 的,不能再被修改// MAX_VALUE = 200;}
}

在这个例子中,MAX_VALUE 是一个 final 静态变量,它在声明时被赋值为100,并且不能再被修改。

二、 final 方法

final 关键字用于方法时,表示该方法不能被子类重写。这对于设计不可变类或防止子类改变关键行为非常有用。

public class FinalExample {public final void showMessage() {System.out.println("This is a final method");}
}class SubClass extends FinalExample {// 下面的代码将会报错,因为 showMessage 是 final 的,不能被重写// @Override// public void showMessage() {//     System.out.println("Attempting to override final method");// }
}public class Main {public static void main(String[] args) {SubClass subClass = new SubClass();subClass.showMessage();}
}

在这个例子中,showMessage 方法被声明为 final,因此它不能被 SubClass 重写。如果尝试重写,编译器会报错。

三、 final

final 关键字用于类时,表示该类不能被继承。这对于设计不可变类或确保类的完整性非常有用。

public final class FinalExample {public void showMessage() {System.out.println("This is a final class");}
}// 下面的代码将会报错,因为 FinalExample 是 final 的,不能被继承
// class SubClass extends FinalExample {
// }public class Main {public static void main(String[] args) {FinalExample example = new FinalExample();example.showMessage();}
}

在这个例子中,FinalExample 类被声明为 final,因此它不能被继承。如果尝试继承,编译器会报错。

四、 final 关键字的实际应用

final 关键字在实际编程中有广泛的应用,以下是一些常见的使用场景:

1. 定义常量

在程序中定义常量时,通常使用 final 关键字。这可以确保常量的值在整个程序中保持不变。

public class Constants {public static final String APP_NAME = "My Application";public static final int MAX_USERS = 100;public static void main(String[] args) {System.out.println("App Name: " + APP_NAME);System.out.println("Max Users: " + MAX_USERS);}
}
2. 防止方法被重写

在设计类时,某些方法可能不希望被子类重写,以确保其行为的一致性和完整性。此时可以将方法声明为 final

public class BaseClass {public final void logAction(String action) {System.out.println("Action: " + action);}
}class SubClass extends BaseClass {// logAction 方法不能被重写
}public class Main {public static void main(String[] args) {SubClass subClass = new SubClass();subClass.logAction("Login");}
}
3. 创建不可变类

不可变类是指一旦创建就不能修改的类。通过将类声明为 final 并将其所有成员变量声明为 final,可以实现不可变类。

public final class ImmutablePerson {private final String name;private final int age;public ImmutablePerson(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}
}public class Main {public static void main(String[] args) {ImmutablePerson person = new ImmutablePerson("Alice", 30);System.out.println("Name: " + person.getName());System.out.println("Age: " + person.getAge());// 下面的代码将会报错,因为 ImmutablePerson 是不可变的// person.name = "Bob";// person.age = 25;}
}
4. 优化性能

在某些情况下,将方法或类声明为 final 可以帮助Java编译器进行优化,提高性能。这是因为编译器可以确定这些方法或类不会被重写,从而进行内联优化。

五、 final 的一些常见误区

在使用 final 关键字时,初学者可能会遇到一些常见的误区。了解这些误区可以帮助你更好地使用 final 关键字。

1. final 变量不能在构造方法中赋值

这是一个常见的误解。实际上,final 实例变量可以在声明时赋值,也可以在构造方法中赋值。

public class FinalExample {private final int value;public FinalExample(int value) {this.value = value;}
}
2. final 类中的所有方法都是 final

虽然 final 类不能被继承,但这并不意味着其所有方法都是 final 的。方法是否为 final 需要显式声明。

public final class FinalClass {public void method1() {System.out.println("Method1");}public final void method2() {System.out.println("Method2");}
}

在这个例子中,`

method1不是final的,而method2final` 的。

3. final 变量的引用不能改变

对于引用类型的 final 变量,final 关键字只保证引用本身不能改变,但引用的对象内容可以改变。

public class FinalExample {private final StringBuilder builder = new StringBuilder();public void appendText(String text) {builder.append(text);}public String getText() {return builder.toString();}public static void main(String[] args) {FinalExample example = new FinalExample();example.appendText("Hello, ");example.appendText("World!");System.out.println(example.getText());// 下面的代码将会报错,因为 builder 是 final 的,不能再赋值// example.builder = new StringBuilder();}
}

在这个例子中,builder 是一个 final 引用,虽然引用不能改变,但 StringBuilder 对象的内容可以改变。

结论

final 关键字是Java编程中一个非常重要的工具,它有助于提高代码的安全性、稳定性和性能。通过理解和正确使用 final 关键字,我们可以编写出更健壮、更高效的代码。

无论是定义常量、防止方法被重写、创建不可变类,还是优化性能,final 关键字都扮演着重要的角色。希望通过这篇文章,你能更深入地理解 final 关键字的使用场景和实际应用,让你的编程技能更上一层楼。

继续探索和实践 final 关键字的各种用法吧,你会发现它在编程中是一个不可或缺的终极武器!

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

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

相关文章

【JavaSE】程序逻辑控制

目录 1. 顺序结构 2. 分支结构 2.1 if语句 2.1.1 语法格式1 2.1.2 语法格式2 2.1.3 语法格式3 2.1.4 练习 2.1.5 注意事项 2.2 switch 语句 3. 循环结构 3.1 while循环 3.1.1 语法格式 3.1.2 代码示例 3.1.3 注意事项 3.2 break 3.3 continue 3.4 for循环 …

scratch3编程05-画笔绘制圆及与圆相关的图形

目录 一,圆 1,空心圆 2,实心圆 3,嵌套在一起的圆 4,圆环 二,五角星 1,空心五角星 1)思路 2)完整的程序 2,实心五角星 1)思路 2&…

RK3568笔记三十三: helloworld 驱动测试

若该文为原创文章,转载请注明原文出处。 报着学习态度,接下来学习驱动是如何使用的,从简单的helloworld驱动学习起。 开始编写第一个驱动程序—helloworld 驱动。 一、环境 1、开发板:正点原子的ATK-DLRK3568 2、系统&#xf…

d3dcompiler_43.dll文件是什么?如何快速有效的解决d3dcompiler_43.dll文件丢失问题

dcompiler_43.dll 是一个Windows系统中的系统文件,属于DirectX软件的一部分。这个dcompiler_43.dll(动态链接库)文件主要用于处理与3D图形编程有关的任务,是运行许多游戏和高级图形程序必需的组件之一。那么如果电脑丢失d3dcompil…

香蕉派BPI-Wifi6迷你路由器公开发售

Banana Pi BPI-Wifi6 Mini 公开发售。 Banana Pi BPI-Wifi6 Mini 开源路由器采用Triductor TR6560 TR5220 wifi SOC设计,是一款迷你尺寸的wifi6路由器解决方案。内置高性能双核ARM Cortec A9处理器用于WIFI报文转发或智能业务处理,内置高性能LSW和硬件N…

ubuntu 上vscode +cmake的debug调试配置方法

在ubuntu配置pcl点云库以及opencv库的时候,需要在CMakeLists.txt中加入相应的代码。配置完成后,无法调试,与在windows上体验vs studio差别有点大。 找了好多调试debug配置方法,最终能用的有几种,但是有一种特别好用&a…

ubuntu部署minio集群

minio集群介绍 官方文档:https://min.io/docs/minio/linux/operations/install-deploy-manage/deploy-minio-multi-node-multi-drive.html 本方案采用在多节点多驱动器 (MNMD) 或“分布式”配置部署 MinIO。 MNMD 部署提供企业级性能、可用​​性和可扩展性&#…

jmeter-beanshell学习4-beanshell截取字符串

再写个简单点的东西,截取字符串,参数化文件统一用csv,然后还要用excel打开,如果是数字很容易格式就乱了。有同事是用双引号把数字引起来,报文里就不用加引号了,但是这样beanshell处理起来,好像容…

Facebook社交平台的未来发展趋势分析

随着科技和社交需求的不断演变,Facebook作为全球最大的社交平台之一,其未来发展的趋势备受关注。从技术创新到社会影响,Facebook正在经历着前所未有的变化和挑战。本文将探讨Facebook未来发展的几个关键趋势,并分析其可能的影响和…

MySQL MVCC

总结自小林coding,bojiangzhou 脏读、不可重复读、幻读 说的都是并发读取的问题,最简单的方式就是给记录加一把锁,不管是更新、读取记录都需要竞争到这把锁之后才能操作。但这种方式的并发性能可想而知会有多么低。 于是 InnoDB 就设计了MVC…

LeetCode HOT100(二)双指针

移动0 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 解法1:双指针交换 指针L&…

“论基于构件的软件开发方法及其应用”写作框架,软考高级论文,系统架构设计师论文

论文真题 基于构作的软件开发 (Component-Based Software Development,CBSD) 是一种基于分布对象技术、强调通过可复用构件设计与构造软件系统的软件复用途径。基于构件的软件系统中的构件可以是COTS (Commercial-Off-the-Shelf)构件&#x…

Spring Boot轻松整合Minio实现文件上传下载功能

一、Linux 安装Minio 安装 在/root/xxkfz/soft目录下面创建文件minio文件夹,进入minio文件夹,并创建data目录; [rootxxkfz soft]# mkdir minio [rootxxkfz soft]# cd minio [rootxxkfz minio]# mkdir data 执行如下命令进行下载 [rootxx…

Java内存划分详解:从基础到进阶

Java内存划分详解:从基础到进阶 1. 程序计数器(Program Counter Register)2. Java虚拟机栈(Java Virtual Machine Stack)3. 堆(Heap)4. 方法区(Method Area)5. 运行时常量…

[计网初识1] TCP/UDP

学习内容 1.TCP建立链接的3次握手,断开连接的4次挥手 2.TCP报文段组成 内容 1.TCP 建立连接的3次握手? 假设主动方是客户端,被动方是服务端。 第一次 客户端给服务端发送 “hello,我是客户端” (TCP段中 SYN1) 第二次 服务端给客户端发送"我接…

从零开始的python学习生活2

接上封装 class Phone:__volt0.5def __keepsinglecore(self):print("让cpu以单核运行")def if5G(self):if self.__volt>1:print("5G通话已开启")else:self.__keepsinglecore()print("电量不足,无法使用5G通话,已经设置为单…

Django项目创建的准备工作【 2 】

【 一 】调整后端目录 #1 目录结构 """ ├── luffy_api├── logs/ # 项目运行时/开发时日志目录 - 包├── manage.py # 脚本文件├── luffy_api/ # 项目主应用,开发时的代码保存 - 包├── apps/ …

【Git基本操作】添加文件 | 修改文件 | 及其各场景下.git目录树的变化

目录 1. 添加文件&add操作和commit操作 2. .git树状目录的变化 3. git其他操作 4. 修改文件 4.1 git status 4.2 git diff 1. 添加文件&add操作和commit操作 add操作:将工作区中所有文件的修改内容 添加进版本库的暂存区中。commit操作:…

系统服务综合实验(dns服务,nfs服务)

题目:现有主机 node01 和 node02,完成如下需求: 1、在 node01 主机上提供 DNS 和 WEB 服务 2、dns 服务提供本实验所有主机名解析 3、web服务提供 www.rhce.com 虚拟主机 4…

three-tile: 1. 第一个three-tile程序

上篇介绍了:three-tile: 一个开源的轻量级三维瓦片库-CSDN博客 three-tile 是一个开源的轻量级三维瓦片库,它基于threejs使用typescript开发,提供一个三维地形模型,能轻松给你的应用增加三维瓦片地图。 项目地址&…