📜  Java中的最终与不变性

📅  最后修改于: 2022-05-13 01:54:46.493000             🧑  作者: Mango

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 的新对象时,它不会通过向控制台抛出错误来创建对象。