为什么我可以在Java中编辑一个final数组的内容?

11 浏览
0 Comments

为什么我可以在Java中编辑一个final数组的内容?

以下的Java代码使用了一个String的final数组。

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

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

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] + " ");
    }
  }
}

错误:无法分配给final变量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

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

0