问:final关键字在JAVA中有哪些用法?

devtools/2024/11/20 13:26:12/

final关键字的问题在面试中很常见,深入理解其背后的机制确实能提升对Java语言特性的掌握程度。下面,代码示例来说明final的用法。

1. 被final修饰的类不可以被继承

java">final class FinalClass {// 类内容
}// 错误示例:尝试继承FinalClass
// class SubClass extends FinalClass {
// }

2. 被final修饰的方法不可以被重写

java">class Parent {final void finalMethod() {System.out.println("Parent method");}
}class Child extends Parent {// 错误示例:尝试重写finalMethod// @Override// void finalMethod() {//     System.out.println("Child method");// }
}

3. 被final修饰的变量不可以被改变

对于基本数据类型:

java">final int finalInt = 5;
// finalInt = 10; // 这将导致编译错误

对于引用类型:

java">final List<String> finalList = new ArrayList<>();
finalList.add("Hello"); // 合法,因为finalList引用没有改变
// finalList = new ArrayList<>(); // 这将导致编译错误

4. 被final修饰的方法,JVM会尝试将其内联

这一点是JVM优化的一部分,通常不会直接在代码中体现,但了解其原理有助于理解性能优化。

5. 被final修饰的常量,在编译阶段会存入常量池中

java">public class FinalConstants {public static final String CONSTANT = "Hello, World!";public static void main(String[] args) {System.out.println(CONSTANT);}
}

在这个例子中,CONSTANT 会在编译时被解析为常量值,并存储在常量池中。

编译器对final域的两个重排序规则

构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序
java">class FinalFieldExample {final int x;int y;public FinalFieldExample(int x, int y) {this.x = x; // 写入final域this.y = y;}// 构造函数结束后,对象的引用才可以被安全地发布
}
初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序

这个规则确保了线程安全,特别是在构造函数中初始化final字段时,确保了其他线程在读取到这个对象引用后,能够看到所有final字段的正确初始化值。

java">// 假设在并发环境中
FinalFieldExample obj = new FinalFieldExample(1, 2);
// 在这里,所有线程都能看到obj.x的值已经被初始化为1

理解这些规则和示例能帮助你编写更加健壮和高效的Java代码。


http://www.ppmy.cn/devtools/104706.html

相关文章

C语言基础(三十一)

1、线性搜索&#xff1a; #include "date.h" #include <stdio.h> #include <stdlib.h> #include <time.h> // 希尔排序 void shellSort(int arr[], int n) { for (int gap n / 2; gap > 0; gap / 2) { for (int i gap; i < n; i…

Redis基础知识学习笔记(二)

文章目录 一.Redis安装1.Windows 下安装1>资源管理器目录进入2>目录进入命令:3.配置环境变量 2.Linux 下安装1> 安装redis2> 启动redis3> 查看 redis 是否启动 二.Redis配置1. 查看配置2. 编辑配置3. 参数说明 三.Redis数据类型1. String&#xff08;字符串&…

C#学习笔记(一)了解C#

博主刚开始接触C#&#xff0c;本系列为学习记录&#xff0c;如有错误欢迎各位大佬指正&#xff01;期待互相交流&#xff01; 文章目录 一、C#语言介绍1.1 C#注释方法1.2 标准格式 二、字符串相关2.1 Console.WriteLine输出2.1.1 输出字符串2.1.2 字符串内插 2.2 获取字符串长度…

【C++】list的使用和list的模拟实现和迭代器失效问题

目录 一、list 的简单介绍 二、list 的基本使用 &#x1f389;list的构造 &#x1f389;list iterator 的使用 &#x1f389;list capacity &#x1f389;list element access &#x1f389;list modifiers &#x1f389;list operator 三、list 的模拟实现 &#x…

使用session实现单用户多端登录限制

基本流程&#xff1a; 首先获得当前浏览器访问服务器的session&#xff0c;然后根据用户的信息&#xff08;如id等&#xff09;在redis中查找&#xff0c;如果找到&#xff0c;并且和查找对应的session不同&#xff0c;则可以判断已经有其他设备登录过了&#xff0c;这个时候就…

CohereForAI更新企业级开源模型 c4ai-command-r-08-2024和c4ai-command-r-plus-08-2024

C4AI Command R 08-2024 是一个 350 亿参数高性能生成模型的研究版本。 Command R 08-2024 是一个大型语言模型&#xff0c;采用开放式权重&#xff0c;针对推理、总结和问题解答等各种用例进行了优化。 Command R 08-2024 具备多语言生成功能&#xff0c;曾在 23 种语言上进行…

编译可执行命令的FFmpeg

上一篇讲到了使用FFmpeg生成视频封面图&#xff0c;其实也可以直接使用FFmpeg相关命令截取一帧的图像数据保存到本地&#xff0c;然后加载到ImageView上&#xff0c;有时候使用命令确实比写代码更加简单和使人轻松一点&#xff0c;所以这一篇是讲解如何导入FFmpeg相关源码 然后…

传感器模块查询表

包含内容&#xff1a;原理图 驱动代码 关注不迷路&#xff0c;需求快查询 时间传感器模块2024.09.01HX711称重模块