Java中的最终与不变性
final:在Java中,final 是一个修饰符,也用于类、方法和变量。当一个变量用 final 关键字声明时,它的值不能被修改,本质上是一个常量。
不变性:简单来说,不变性就是加班不变或无法改变。在Java中,我们知道 String 对象是不可变的,这意味着我们不能对现有的 String 对象进行任何更改。
最终和不变性之间的区别
- final 意味着您不能将对象的引用更改为指向另一个引用或另一个对象,但您仍然可以改变它的状态(例如使用 setter 方法)。而不可变意味着对象的实际值无法更改,但您可以将其引用更改为另一个。
- final修饰符适用于变量但不适用于对象,而不变性适用于对象但不适用于变量。
- 通过将引用变量声明为最终变量,即使引用变量是最终变量,我们也不会获得任何不变性。我们可以在相应的 Object 中执行任何类型的更改。但是我们不能对该变量执行重新分配。
- final 确保对象的地址保持不变,而 Immutable 表明我们不能在创建后更改对象的状态。
JAVA
// Java program to illustrate
// difference between final
// and immutability
class Geeks {
public static void main(String[] args)
{
final StringBuffer sb = new StringBuffer("Hello");
// Even though reference variable sb is final
// We can perform any changes
sb.append("GFG");
System.out.println(sb);
// Here we will get Compile time error
// Because reassignment is not possible for final variable
sb = new StringBuffer("Hello World");
System.out.println(sb);
}
}
输出:
Geeks.java:14: error: cannot assign a value to final variable sb
sb = new StringBuffer("Hello World");
^
1 error
上述程序的图示
说明:在上图中,我们可以看到我们通过将引用设为final来创建一个StringBuffer类的对象。
- 将引用变量声明为 final,并不意味着该对象是不可变的。
- 在下一行中,我们正在对创建的对象执行 append() 操作,并且它已成功更改。
- 如果对象是不可变的,那么上面的追加操作就无法完成。
- 但是它执行成功,因为我们将引用变量声明为 final。 final 意味着我们不能再次将任何内容重新分配给该引用变量。
- 因此,当我们尝试创建 StringBuffer 的新对象时,它不会通过向控制台抛出错误来创建对象。