Java 中的有效 final 变量及示例2025年1月7日 | 阅读 4 分钟 在 Java 中,**有效 final** 变量是指没有声明为 final 关键字,但其值在初始赋值后未被更改的变量。当使用 lambda 表达式和匿名内部类时,此概念至关重要,因为它们只能访问是 final 或有效 final 的局部变量。 有效 final 变量是局部变量,它
尽管未用 final 关键字标记,但由于其值在初始赋值后从未修改,因此它表现得像 final 变量。如果有效 final 变量在初始赋值后被赋新值,其属性可能会丢失。 文件名:EffectiveFinalExample.java 输出 ERROR! /tmp/L86saMCavD/EffectiveFinalExample.java:27: error: local variables referenced from an inner class must be final or effectively final operand1 = operand2 % 2; // Compilation error ERROR! ^ /tmp/L86saMCavD/EffectiveFinalExample.java:33: error: local variables referenced from an inner class must be final or effectively final return rem + operand2; ^ /tmp/L86saMCavD/EffectiveFinalExample.java:39: error: local variables referenced from an inner class must be final or effectively final return rem * operand1; ^ 3 errors Lambda 表达式捕获值在 Java 中使用 lambda 表达式时,对其可以访问的局部变量有一个重要的限制。具体来说,lambda 表达式只能处理值保持不变的局部变量。此规则称为**变量捕获**,意味着 lambda 表达式捕获变量的值,而不是变量本身。 Lambda 表达式使用的局部变量必须是**有效 final**。此术语指只赋值一次且之后不进行修改的变量。尽管这些变量不需要显式声明为 final,但这样做可以明确其预期的不可变性。 示例和解释考虑一个场景,我们有一个局部变量 i,其初始值为 7。如果我们在 lambda 表达式中尝试更改 i 的值,编译器将产生一个错误。错误消息将是:“在封闭作用域中定义的局部变量 i 必须是 final 或有效 final。”之所以发生这种情况,是因为 lambda 表达式要求局部变量在其执行过程中保持一致的值。 文件名:EffectiveFinalExample.java 输出 ERROR! /tmp/vGTOxU9wYP/EffectiveFinalExample.java:20: error: local variables referenced from a lambda expression must be final or effectively final ERROR! i = num1 + num2; ^ /tmp/vGTOxU9wYP/EffectiveFinalExample.java:22: error: local variables referenced from a lambda expression must be final or effectively final return i; ^ 2 errors 有效 final 变量的优点代码更整洁:有效 final 变量有助于简化代码,尤其是在使用 lambda 表达式和匿名内部类时。您不必将每个局部变量都声明为 final,这减少了样板代码,并使代码更简洁。 封装:通过利用有效 final 变量,您可以鼓励将变量封装在尽可能小的作用域内。此方法可最大程度地降低代码其他部分意外修改的风险,从而更好地控制变量访问。 并发:在多线程场景中,有效 final 变量提供了额外的安全性。由于这些变量本质上是只读的,因此它们可以降低数据争用和同步问题的风险,从而实现更可靠的并发编程。 最佳实践
|
在本节中,我们将创建一个 Java 程序,该程序在数组中实现两个栈。两个栈意味着这两个栈都使用同一个数组来存储元素。以下是必须由这两个栈实现的几个方法...
阅读 3 分钟
java.nio.DoubleBuffer 类有一个 slice() 函数。通过 DoubleBuffer 类创建的新 double 缓冲区所包含的内容是原始缓冲区内容的一个相似子序列。缓冲区的内容将从该缓冲区的当前位置开始。则...
阅读 3 分钟
Java ConcurrentSkipListSet 类实现了 Collection 接口和 AbstractSet 类,作为 Java Collection Framework 的一部分。它提供了 Java 中 NavigableSet 的并发、可扩展版本。ConcurrentSkipListSet 在其实现中基于 ConcurrentSkipListMap。取决于是否使用构造函数,条目...
阅读 16 分钟
java.nio.DoubleBuffer 有 order() 函数。可以使用 DoubleBuffer 类获取此 DoubleBuffer 实例的 ByteOrder。语法:public abstract ByteOrder order()返回值:此函数返回此缓冲区的字节顺序。示例 1:代码展示了如何管理和检查内容……
阅读 2 分钟
JSON 是一种数据交换格式。它是一种广泛使用、轻量级且与语言无关的格式。它能够将数据从 JSON 转换为 XML。Java 提供了大量的 JSON 包。借助这些包,我们可以从 JSONObject 检索或获取值。
阅读 4 分钟
在本节中,我们将学习 Java 中的二叉树的左视图,以及实现它的不同方法。在二叉树的左视图中,我们只打印二叉树中可见的节点,当二叉树...
阅读 4 分钟
是发生在我们尝试将一种类对象转换为另一种类对象时发生的未检查异常之一。当我们将父类的对象强制转换为子类对象时,会抛出 ClassCastException。然而,它也可以……
阅读1分钟
Eclipse 是最受欢迎的 Java 应用程序开发 IDE。为了有效地使用 Eclipse,我们必须熟悉 Eclipse IDE 的工作区、概念和组件。在继续本节之前,我们将了解 Java 中的 Eclipse 是什么,Eclipse 平台概述,以及...
5 分钟阅读
线程死锁是多线程 Java 程序中可能遇到的常见问题。当两个或多个线程因等待继续运行所需的资源释放而卡住时,就会发生这种情况。以下是一些避免线程死锁的方法...
阅读 15 分钟
在本教程中,我们将讨论 Java 中不匹配的位数问题。在这个问题中,给出了两个数字(f1 和 f2)。我们的任务是比较这两个数字的二进制表示时,找出不匹配的位数...
11 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India