Java final和不可变性的比较

Java final和不可变性的比较

在Java中,“final”关键字可用于定义常量值,并防止变量、方法或类的更改或覆盖。另一方面,不可变性描述了对象在其存在期间保持恒定状态的特性。对象的值在形成后不会发生改变。

变量、方法和类受到“final”关键字的限制,但不可变性进一步保证了对象的整个状态的一致性。

让我们在本文中了解final和不可变性之间的关键区别。

Java中的final

Java中的final关键字具有以下几个特点:

  • final变量:它们的初始值在初始化后不能修改。它们经常用于声明不可更改的值。

  • final方法:它们不能被子类修改,确保它们的行为一致。它们有助于保持重要过程的有效性。

  • final类:它们不能被其他类扩展,确保它们的实现不变。final类常用于构建安全或实用程序类。

  • 初始化:为了确保final变量具有已知值,它们必须在声明时或构造函数中赋值。

  • 性能:使用final使编译器能够更有效地优化代码,可能导致性能提高。

  • 安全性:final通过防止未经授权的更改敏感数据或行为来提高Java程序的安全性。

Java中的不可变性

在Java中,不可变类是指对象一旦创建后就无法更改其内容的类。要创建不可变类,请遵循以下要求:

  • 将类声明为final,以防止继承。

  • 将类的数据成员声明为private以限制直接访问。

  • 将数据成员声明为final以防止对象创建后的修改。

  • 使用参数化构造函数以深拷贝初始化所有字段,以防止通过对象引用进行修改。

  • 在getter方法中返回对象的副本(深拷贝),而不是实际的对象引用,以保持不可变性。

通过遵循这些特点,您可以在Java中创建自己的不可变类,类似于内置的不可变类,例如Integer、Boolean、Byte、Short和String。

final和不可变性之间的差异

在Java编程中,理解“final”和“不可变性”之间的区别是至关重要的。

  • Final:保留对象引用并允许状态变化

我们从”final”开始。当一个对象或变量在Java中被标记为final时,它表示在给定一个值之后,引用不能被更改为指向另一个对象或变量。重要的是要记住,尽管引用被固定了,但使用相关的setter方法仍然允许您更改对象的状态。因此,即使引用本身无法更改,您仍然可以使用可访问的方法来更改对象的内部属性或特性。换句话说,final保证了对象引用的稳定性,同时允许对其内部状态进行修改。

  • Immutable:不可变值和引用的灵活性

现在我们来看看”immutable”。在Java中,不可变性指的是对象在创建后其实际值无法更改。然而,与final不同的是,您可以修改引用本身并将其赋值给另一个对象或变量。这意味着尽管对象的值保持不变,但您可以更改其引用以指向不同的实例。

  • 应用和范围:Final和不可变性

修饰符”final”适用于Java中的变量而不是对象。它强调了对更改引用或变量的限制,同时允许修改对象的状态。另一方面,不可变性适用于对象,表示它们的值一旦创建就无法更改。了解这两个概念之间的区别对于确保Java程序的预期行为非常重要。

  • 影响:对象地址和状态的可变性

当我们将对象或变量声明为final时,我们正在强制保持其地址的永久性。换句话说,引用保持固定,阻止对其指向位置的任何更改。相比之下,不可变性强调了在对象创建后无法修改其状态。这意味着对象的内部值无法更改,从而保持其在程序执行期间的完整性和一致性。

StringerBuffer()

该代码演示了Java中”final”关键字和不可变性之间的区别。”final”关键字使变量成为常量,防止重新赋值,而不可变性意味着对象本身无法修改。

步骤

  • 步骤1:将变量”sb”声明为final StringBuffer对象,并将初始值设置为”Hello”。

  • 步骤2:使用append()方法将”TP”附加到由”sb”引用的StringBuffer对象。

  • 步骤3:打印”sb”的更新后的值,即”HelloTP”。

  • 步骤4:尝试将新的StringBuffer对象重新赋值给变量”sb”,这会导致编译错误。

  • 步骤5:打印”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”关键字限制了对象引用的重新赋值,但允许对对象的状态进行修改。

相反,不可变性防止对对象的值进行更改,但允许重新分配引用。理解“final”和不可变性的应用和范围对于设计可靠的Java程序很重要。当一个对象或变量被声明为final时,它的地址保持不变,而不可变性确保对象的内部值不能被修改。示例代码演示了区别,其中“final”防止重新赋值,导致编译时错误。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程