为什么在Java中声明一个数组为final不能使它不可变?声明final不意味着它不能被改变吗?
从question related to immutable array可以清楚地看到,声明数组final并不能使其不可更改。
以下是可能的。
final int[] array = new int[] {0, 1, 2, 3};
array[0] = 42;
我的问题是:那么在这里声明final的作用是什么呢?
为什么在Java中声明一个数组为final不能使它不可变?声明final不意味着它不能被改变吗?
从question related to immutable array可以清楚地看到,声明数组final并不能使其不可更改。
以下是可能的。
final int[] array = new int[] {0, 1, 2, 3};
array[0] = 42;
我的问题是:那么在这里声明final的作用是什么呢?
6条答案
按热度按时间uemypmqf1#
final
仅关于由其标记的 * 引用 *;在Java中不存在不可变的数组。你不能说
这就是
final
的全部内容。更一般地说,确保一个对象是不可变的通常是一项艰苦的工作,并且充满了一系列微妙之处。语言本身并没有给予太多现成的东西。gxwragnw2#
final
表示您不能更改 * 引用 * -即您不能为该字段分配另一个数组。“不可变”意味着您不能更改数组的 * 内容 *-
final
对此没有影响。如代码所示,可以为数组的 * 一个元素 * 赋值,这不会更改 * 对 * 数组的引用
ccrfmcuu3#
在这里,你创建了一个 object reference
final
,而不是一个原语。(数组也是特殊的Java对象。)创建一个引用final
意味着一旦它被初始化,你就不能让它引用其他对象。但是,当然你可以改变final变量所引用的对象的状态。hkmswyz64#
宣告数组
在Java中,我们声明 * 变量 *,并创建 * 对象 *(如数组)。我们可以声明一个变量而不创建一个对象,也可以创建一个对象而不声明一个变量。
不变性是一个对象的属性,而final是一个变量的属性。一个对象可能被几个变量引用。哪个变量应该控制数组对象的不变性?
如果我们允许这样做,那么
b[0]
的不可变值就已经被改变了。但是编译器如何防止这种情况呢?通过使非final引用无法赋值给final引用吗?那么我该如何初始化数组呢?我不能在循环中这样做...还有:数组不可变到底意味着什么?例如,下面的代码应该编译吗?
C解决这个问题的方法是允许为每一级间接寻址指定(或省略)
const
。在Java中,每个变量可以指定(或省略)final一次。是的,final
是一个更简单的const
,就像Java是一个更简单的C一样。让我们保持简单,好吗?9vw9lbht5#
这表示不允许对象的新执行严修。
ymdaylpp6#
就像大家评论的那样,声明final不会让你给变量赋值另一个数组。
数组本身将保留与以前相同的属性。