当前位置: 首页 > 面试题库 >

Java中的“ final”关键字如何工作?(我仍然可以修改对象。)

南门承教
2023-03-14
问题内容

在Java中,我们使用final带有变量的关键字来指定其值不被更改。但是我看到你可以在类的构造函数/方法中更改值。同样,如果变量是static,则为编译错误。

这是代码:

import java.util.ArrayList;
import java.util.List;

class Test {
  private final List foo;

  public Test()
  {
      foo = new ArrayList();
      foo.add("foo"); // Modification-1
  }
  public static void main(String[] args) 
  {
      Test t = new Test();
      t.foo.add("bar"); // Modification-2
      System.out.println("print - " + t.foo);
  }
}

上面的代码工作正常,没有错误。

现在将变量更改为static

private static final List foo;

现在是编译错误。这final真的如何运作?


问题答案:

你总是允许初始化一个final变量。编译器确保你只能执行一次。

请注意,对存储在final变量中的对象的调用方法与的语义无关final。换句话说:final仅与引用本身有关,而与引用对象的内容无关。

Java没有对象不变性的概念。这是通过精心设计对象来实现的,这是一项艰巨的工作。



 类似资料:
  • 在Java中,我们使用关键字和变量来指定其值不可更改。但我看到您可以更改类的构造函数/方法中的值。同样,如果变量是,那么这是一个编译错误。 代码如下: 上面的代码工作良好,没有错误。 现在将变量更改为: 现在是编译错误。这个是如何工作的?

  • 问题内容: 我从一开始就阅读Java教程,并且对字段或变量上的关键字有疑问。如这里所说: 类变量是使用static修饰符声明的任何字段;这告诉编译器,无论该类被实例化了多少次,该变量确实存在一个副本。可以将定义特定类型自行车的齿轮数的字段标记为静态,因为从概念上讲,相同数量的齿轮将应用于所有情况。 这样,我想如果您有一个对象(在这种情况下,该类是一个实例),并且在其中有一个字段,则与您是否喜欢or

  • 从https://projects.spring.io/spring-framework/,我有一个spring framework hellpworld程序。我删除了注释。然而,程序仍然可以像以前一样运行。为什么?这里的角色是什么?

  • 问题内容: 在下面的代码片段中,结果确实令人困惑。 结果是 为什么“ this”在父亲构造函数中指向Son,而“ this.x”却指向父亲在构造函数中的“ x”字段。“ this”关键字如何运作? 我知道 多态的 概念,但是[1]和[2]之间没有区别吗?触发 新的Son() 时,内存中发生了什么? 问题答案: 默认情况下,所有成员函数在Java中都是多态的。这意味着当您调用this.toStrin

  • 问题内容: 我有一个带班级的文件。路径是: 我在此目录中有一个文件: 在这个文件中,我想实例化一个类。 我知道我可以使用或关键字将文件包含在类中: 但是我想不使用或导入类。我试图了解关键字的工作原理。我尝试了这些步骤,但没有任何效果: 它说: 关键字如何运作?我可以用它导入课程吗? 问题答案: 不包含任何内容。它只是将指定的名称空间(或类)导入当前范围 如果您想自动加载类-请阅读有关自动加载的信息

  • 我刚刚阅读了关于特征以及如何在同一个用逗号分隔的php代码中使用多个php特征的信息。然而,我不明白用于在两个特征具有相同功能的情况下解决冲突的替代关键字的概念。有人能解释一下替代关键字是如何工作的吗?以及如何使用它来告诉引擎,我愿意使用特征A的函数hello()而不是特征B的函数Hello(),因为这两个特征中都有两个特征A和B以及一个函数hello()。