为什么在Java中声明一个数组final不能使其不可变?

jxct1oxe  于 2022-11-27  发布在  Java
关注(0)|答案(6)|浏览(221)

为什么在Java中声明一个数组为final不能使它不可变?声明final不意味着它不能被改变吗?
question related to immutable array可以清楚地看到,声明数组final并不能使其不可更改。
以下是可能的。

final int[] array = new int[] {0, 1, 2, 3};
array[0] = 42;

我的问题是:那么在这里声明final的作用是什么呢?

uemypmqf

uemypmqf1#

final仅关于由其标记的 * 引用 *;在Java中不存在不可变的数组。

private final int[] xs = new int[20];

你不能说

xs = new int[10];

这就是final的全部内容。更一般地说,确保一个对象是不可变的通常是一项艰苦的工作,并且充满了一系列微妙之处。语言本身并没有给予太多现成的东西。

gxwragnw

gxwragnw2#

final表示您不能更改 * 引用 * -即您不能为该字段分配另一个数组。
“不可变”意味着您不能更改数组的 * 内容 *-final对此没有影响。
如代码所示,可以为数组的 * 一个元素 * 赋值,这不会更改 * 对 * 数组的引用

ccrfmcuu

ccrfmcuu3#

在这里,你创建了一个 object referencefinal,而不是一个原语。(数组也是特殊的Java对象。)创建一个引用final意味着一旦它被初始化,你就不能让它引用其他对象。但是,当然你可以改变final变量所引用的对象的状态。

hkmswyz6

hkmswyz64#

宣告数组
在Java中,我们声明 * 变量 *,并创建 * 对象 *(如数组)。我们可以声明一个变量而不创建一个对象,也可以创建一个对象而不声明一个变量。
不变性是一个对象的属性,而final是一个变量的属性。一个对象可能被几个变量引用。哪个变量应该控制数组对象的不变性?

int[] a = {1,2,3};
final int[] b = a;
a[0] = 10; // should this be legal?

如果我们允许这样做,那么b[0]的不可变值就已经被改变了。但是编译器如何防止这种情况呢?通过使非final引用无法赋值给final引用吗?那么我该如何初始化数组呢?我不能在循环中这样做...
还有:数组不可变到底意味着什么?例如,下面的代码应该编译吗?

final int[][] a = {{1,2}, {3,4}};
a[1][1] = 5;

C解决这个问题的方法是允许为每一级间接寻址指定(或省略)const。在Java中,每个变量可以指定(或省略)final一次。是的,final是一个更简单的const,就像Java是一个更简单的C一样。让我们保持简单,好吗?

9vw9lbht

9vw9lbht5#

这表示不允许对象的新执行严修。

ymdaylpp

ymdaylpp6#

就像大家评论的那样,声明final不会让你给变量赋值另一个数组。
数组本身将保留与以前相同的属性。

相关问题