问:Java中final关键字有哪些用法和作用?

devtools/2024/9/24 18:18:56/

final 关键字在 Java 中确实是一个重要且常用的概念,理解它对掌握 Java 语言特性很有帮助。笔者基于这篇内容,说明 final 的作用与用法,并解释编译器对 final 域的重排序规则。

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

java">public final class FinalClass {// Class body
}// 编译错误:无法继承 final 类
// public class SubClass extends FinalClass {
// }

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

java">public class ParentClass {public final void finalMethod() {System.out.println("This is a final method.");}
}public class ChildClass extends ParentClass {// 编译错误:无法重写 final 方法// public void finalMethod() {//     System.out.println("Attempt to override final method.");// }
}

3. 被 final 修饰的变量不可以被改变。如果修饰引用,那么表示引用不可变,引用指向的内容可变。

java">public class FinalVariableExample {public static void main(String[] args) {final int finalPrimitive = 10;// 编译错误:无法更改 final 变量的值// finalPrimitive = 20;final StringBuilder finalReference = new StringBuilder("Hello");// 合法:final 引用指向的对象内容可以更改finalReference.append(" World");System.out.println(finalReference); // 输出:Hello World// 编译错误:final 引用不能指向新的对象// finalReference = new StringBuilder("New String");}
}

4. 被 final 修饰的方法,JVM 会尝试将其内联,以提高运行效率

内联优化是由 JVM 在运行时决定的。可以理解为一个 final 方法会在编译期被认为是稳定的,JVM 有可能会将其调用替换为方法体,以减少方法调用的开销。

java">public class FinalMethodExample {public final void inlineMethod() {System.out.println("This method might be inlined by JVM.");}public static void main(String[] args) {FinalMethodExample example = new FinalMethodExample();for (int i = 0; i < 1000; i++) {example.inlineMethod(); // JVM 可能会内联此方法调用}}
}

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

当 final 修饰基本数据类型或 String 类型,并且在编译时就能确定其值时,该值会被编译器存入常量池中。

java">public class FinalConstantExample {public static final int CONSTANT_VALUE = 100;public static final String CONSTANT_STRING = "FINAL_STRING";public static void main(String[] args) {// 使用常量池中的值System.out.println(CONSTANT_VALUE);System.out.println(CONSTANT_STRING);}
}

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

规则 1:在构造函数内对一个 final 域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序
java">public class FinalFieldExample {private final int finalField;public FinalFieldExample(int value) {finalField = value; // 写入 final 域}public static void main(String[] args) {FinalFieldExample example = new FinalFieldExample(42);// 在构造函数返回前,finalField 必须已经被初始化System.out.println(example.finalField); // 输出:42}
}
规则 2:初次读一个包含 final 域的对象的引用,与随后初次读这个 final 域,这两个操作之间不能重排序
java">public class FinalFieldInitialization {private final int finalField;public FinalFieldInitialization() {// 经过构造函数后,finalField 已经被初始化finalField = initializeField();}private int initializeField() {return 42;}public int getFinalField() {return finalField;}public static void main(String[] args) {FinalFieldInitialization example = new FinalFieldInitialization();// 确保在读取 finalField 前,对象的引用已经被正确初始化System.out.println(example.getFinalField()); // 输出:42}
}

通过这些代码示例,我们可以更清楚地理解 final 关键字在 Java 中的作用及其多种用法。掌握这些用法,有助于我们编写更健壮的代码。


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

相关文章

Python爬虫之requests(二)

Python爬虫之requests&#xff08;二&#xff09; 前面演示了requests模块的四种请求方式。接下来再来演示下综合的练习。 一、requests模块综合练习 需求&#xff1a;爬取搜狗知乎某一个词条对应的某个范围页码表示的页面数据。 点开搜狗首页&#xff0c;有一个知乎的版块…

Linux 信号的产生

1. 概念 在Linux系统中&#xff0c;信号是一种进程间通信的机制&#xff0c;它允许操作系统或其他进程向特定进程发送异步通知。我们可以通过命令 kill -l来查看信号的种类&#xff1a; Linux系统中的信号可以分为两大类&#xff1a;传统信号和实时信号。从上图可以看出它们分…

Redis 命令:

1.通用键命令 set key value&#xff1a;设置指定键的值。get key&#xff1a;获取指定键的值。del key [key ...]&#xff1a;删除一个或多个键。expire key seconds&#xff1a;设置键的过期时间&#xff08;以秒为单位&#xff09;。ttl key&#xff1a;查看键的剩余存活时间…

人工智能与机器学习原理精解【23】

文章目录 ANNANN&#xff08;Artificial Neural Network&#xff0c;人工神经网络&#xff09;中的联想记忆定义双向联想记忆&#xff08;BAM&#xff09;BAM的工作原理性质计算例子例题BAM的应用领域 ANN联想记忆的优点ANN联想记忆的缺点 LMS概述一、定义二、性质三、计算四、…

react hooks--React.memo

基本语法 React.memo 高阶组件的使用场景说明&#xff1a; React 组件更新机制&#xff1a;只要父组件状态更新&#xff0c;子组件就会无条件的一起更新。 子组件 props 变化时更新过程&#xff1a;组件代码执行 -> JSX Diff&#xff08;配合虚拟 DOM&#xff09;-> 渲…

基于python+django+vue的旅游网站系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于协同过滤pythondjangovue…

使用jenkins打包unity工程

Apache配置 安装&#xff1a;arch arm64 brew install httpd开启&#xff1a;brew services start httpd重启&#xff1a;brew services restart httpd停止&#xff1a;brew services stop httpd 配置文件路径&#xff1a;/opt/homebrew/etc/httpd/httpd.conf&#xff0c;默认监…

数字IC设计\FPGA 职位经典笔试面试整理--基础篇1

注&#xff1a; 资料都是基于网上一些博客分享和自己学习整理而成的 1&#xff1a;什么是同步逻辑和异步逻辑&#xff1f; 同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。 同步时序 逻辑电路的特点&#xff1a;各触发器的时钟端全部连接在一…