为什么我可以在 Java 中编辑最终数组的内容?

新手上路,请多包涵

以下 Java 代码使用 final String

 final public class Main {
  public static final String[] CONSTANT_ARRAY = {"I", "can", "never", "change"};

  public static void main(String[] args) {
    for (int x = 0; x < CONSTANT_ARRAY.length; x++) {
      System.out.print(CONSTANT_ARRAY[x] + " ");
    }
  }
}

它在控制台上显示以下输出。

>  I can never change
>
> ```

如果我们尝试重新分配声明的 `final` 类型的数组 `String` ,我们会导致错误:

final public class Main { public static final String[] CONSTANT_ARRAY = {“I”, “can”, “never”, “change”};

public static void main(String[] args) { CONSTANT_ARRAY={“I”, “can”, “never”, “change”}; //Error - can not assign to final variable CONSTANT_ARRAY. for (int x = 0; x < CONSTANT_ARRAY.length; x++) { System.out.print(CONSTANT_ARRAY[x] + “ “); } } }


> 错误:无法分配给最终变量 `CONSTANT_ARRAY` 。

但是,以下代码有效:

final public class Main { public static final String[] CONSTANT_ARRAY = {“I”, “can”, “never”, “change”};

public static void main(String[] args) { CONSTANT_ARRAY[2] = “always”; //Compiles fine. for (int x = 0; x < CONSTANT_ARRAY.length; x++) { System.out.print(CONSTANT_ARRAY[x] + “ “); } } }

”`

它显示

I can always change

这意味着我们可以设法修改 final 类型数组 String 的值。我们能否以这种方式修改整个数组而不违反 final 的不可变规则?

原文由 Lion 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 319
2 个回答

final 在Java中影响 _变量_,它与你分配给它的对象无关。

 final String[] myArray = { "hi", "there" };
myArray = anotherArray; // Error, you can't do that. myArray is final
myArray[0] = "over";  // perfectly fine, final has nothing to do with it

编辑以从评论中添加: 请注意,我说 的是 object you are assigning to it 。在 Java 中,数组是一个对象。这同样适用于任何其他对象:

 final List<String> myList = new ArrayList<String>():
myList = anotherList; // error, you can't do that
myList.add("Hi there!"); // perfectly fine.

原文由 Brian Roach 发布,翻译遵循 CC BY-SA 3.0 许可协议

您误解了最终实施。 final 适用于数组对象引用,这意味着一旦启动,引用永远不会改变,但可以填充数组自身。 “它没有违反规则”你只指定了一个关于引用更改的规则,它正在相应地工作。如果您希望这些值也永远不会改变,您应该选择不可变列表,即

List<String> items = Collections.unmodifiableList(Arrays.asList("I", "can", "never", "change"));

原文由 Shehzad 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题