Java 中的“final”关键字可用于定义常量值以及防止变量、方法,或类被更改或覆盖。另一方面,不变性描述了对象在其存在过程中保持恒定状态的特征。对象形成后,其值就不会改变。
变量、方法和类受到“final”关键字的限制,但不变性更进一步,保证了对象的整个状态得到保留。
让我们在本文中了解最终与不变性之间的主要区别。
Java 最终版
Java中的final关键字有几个特点:
-
最终变量:初始化后其初始值无法修改。它们经常被用来声明不可更改或不变的值。
-
最终方法:它们不能被子类修改,保证它们的行为一致。它们有助于保持重要程序的有效性。
-
最终类:它们无法被其他类扩展,保证它们的实现不被改变。 Final 类经常用于构建安全性或实用程序类。
-
初始化:为了确保最终变量具有已知值,必须在声明期间或构造函数中为其赋予值。
-
性能:final 的使用使编译器能够更成功地优化代码,从而可能提高性能。
-
安全性:Final 通过防止未经授权的敏感数据或行为更改来提高 Java 程序的安全性。
Java 中的不变性
在 Java 中,不可变类是指对象的内容一旦创建就无法更改的类。要创建不可变类,请遵循以下要求:
-
将类声明为 Final 以防止继承。
-
将类的数据成员声明为私有以限制直接访问。
-
将数据成员声明为final,以防止在对象创建后进行修改。
-
使用参数化构造函数通过深拷贝初始化所有字段,防止通过对象引用进行修改。
-
在 getter 方法中返回对象的副本(深层副本),而不是实际的对象引用,以保持不变性。
通过遵循这些特性,您可以在 Java 中创建自己的不可变类,类似于 Integer、Boolean、Byte、Short 和 String 等内置不可变类。
最终和不变性之间的差异
当谈到 Java 编程时,理解“final”和“immutable”之间的区别至关重要。
-
最终:保留对象引用并允许状态突变
让我们从“最终”开始。当一个对象或变量在Java中被标记为final时,这意味着在给它一个值之后,该引用不能更改为指向另一个对象或变量。重要的是要记住,尽管引用是固定的,但使用相关的 setter 方法仍然允许您更改对象的状态。因此,即使引用本身无法更改,您仍然可以使用可访问的方法来更改对象的内部属性或属性。换句话说,final 确保对象引用的稳定性,同时允许更改其内部状态。
-
不可变:不可变值和引用灵活性
现在让我们将注意力转向“不可变”。在Java中,不变性是指对象在创建后其实际值不能更改。但是,与 Final 不同的是,您可以修改引用本身并将其分配给另一个对象或变量。这意味着虽然对象的值保持不变,但您可以更改其引用以指向不同的实例。
-
应用和范围:Final 和不变性
修饰符“final”适用于 Java 中的变量而不是对象。它强调对更改引用或变量的限制,同时允许修改对象的状态。另一方面,不变性适用于对象,表明它们的值一旦创建就不能更改。必须了解这两个概念之间的区别,以确保 Java 程序达到预期的行为。
-
含义:对象地址和状态可变性
当我们将一个对象或变量声明为final时,我们就强制其地址的永久性。换句话说,引用保持固定,防止其指向的位置发生任何变化。相比之下,不变性强调了对象一旦创建就无法修改其状态。这意味着对象的内部值无法更改,从而在整个程序执行过程中保持其完整性和一致性。
StringerBuffer()
该代码演示了 Java 中“final”关键字和不变性之间的区别。 “final”关键字使变量成为常量并防止重新分配,而不变性意味着对象本身不能被修改。
算法
-
第 1 步:声明变量“sb”作为最终 StringBuffer 对象,初始值为“Hello”。
-
第2步:使用append()方法将“TP”追加到“sb”引用的StringBuffer对象中。
-
第 3 步:打印“sb”的更新值,即“HelloTP”。
-
第 4 步:尝试将新的 StringBuffer 对象重新分配给变量“sb”,这会导致编译时错误。
-
第五步:打印“sb”的值,但由于上一步错误,该行不会被执行。
示例
// Java program to illustrate difference between final and immutability
public class Tutorialspoint {
public static void main(String[] args)
{
final StringBuffer sb = new StringBuffer("Hello");
// We can make changes even though reference variable sb is final
sb.append("TP");
System.out.println(sb);
// Compile time error will appear here. This is because the final variable cannot be reassigned
sb = new StringBuffer("Hello World");
System.out.println(sb);
}
}
登录后复制
输出
Tutorialspoint.java:16: error: cannot assign a value to final variable sb
sb = new StringBuffer("Hello World");
^
1 error
登录后复制
结论
总而言之,“最终”和不变性在 Java 中具有截然不同的特征。 “final”关键字限制对象引用的重新分配,但允许修改对象的状态。
相反,不变性可以防止更改对象的值,但允许重新分配引用。了解“final”和不变性的应用和范围对于设计可靠的 Java 程序非常重要。当一个对象或变量被声明为final时,它的地址保持固定,而不变性则确保对象的内部值不能被修改。示例代码演示了其中的差异,其中“final”阻止重新分配,从而导致编译时错误。
以上就是Java中的Final与不可变性比较的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!