繁体   English   中英

将最终数组分配给 java 中的数组

[英]Assigning final array to an array in java

考虑以下代码:-

int[] arr=new int[8];
final int[] finalArr=arr;

由于 arrays 是引用类型,这是否意味着arr现在是最终的?如果不是,那么当我更改它时finalArr会发生什么?

看下面的例子:

实际上,如果您将 arr2(final) 等于 arr1(non-final),它不会影响 arr1(non-final),等于操作 (=) 只是表示变量的“值”等于来自内存的引用 (内存中变量值的地址)(因此它只是将变量等同于“值”,而“不”等同于另一个“变量”)

这意味着如果您的 arr2 是最终的,因此您在设置其值后无法更改其值,但您可以更改 arr1 的值,这将“不”影响 arr2 值

static int[] arr1 = new int[]{1, 2, 3};
static final int[] arr2 = arr1;

public static void main(String[] args) {
   System.out.println("before edit| arr1 : " + Arrays.toString(arr1));
   System.out.println("before edit| arr2 : " + Arrays.toString(arr2));

   arr1 = new int[]{5, 2, 4};

   System.out.println("after edit| arr1 : " + Arrays.toString(arr1));
   System.out.println("after edit| arr2 : " + Arrays.toString(arr2));
}

您必须严格区分实例/对象与变量。 Java 中的final是一个仅适用于变量的概念。

在您的代码中,您有两个不同的变量,它们都引用同一个数组实例。 其中一个变量是final ,它既不影响数组也不影响另一个变量。

final不允许重新分配变量,它不允许更改数组。 finalArr[1] = 4; 是完全有效的。

为了说明这一点,考虑

arr ---------|
             |----> instance created by new int[8]
finalArr ----|

您会看到两个不同的 arrays,它们都指向同一个实例。 final确保您不能再更改从finalArr出来的箭头。 所以它总是指向那个数组实例。 但它对您对数组实例本身或对arr所做的操作没有任何限制。


如果您来自 C/C++ 上下文,那么final在这方面与const非常不同。

从例子开始。

int[] arr = new int[8];
final int[] finalArr = arr;

// First let's change some values inside the array beeing referenced.
arr[0] = 12;
finalArr[1] = 13;
// arr = {12, 13, 0, 0, 0, 0, 0, 0}
// finalArr = {12, 13, 0, 0, 0, 0, 0, 0}
// This means we can change the values of an final array
// and that changes to arr and finalArr both target the same array.

arr = new int[2];
// arr = {0, 0}
// finalArr = {12, 13, 0, 0, 0, 0, 0, 0}
// arr now points to the new array created. finalArr still references to the old one.

finalArr = new int[2];
// Can't assign finalArr to a new array because it's final.

所以总结一下:

  • final int[]不会使数组中的值成为最终值。 在 Java arrays 中,大小固定,但内容始终可以更改。
  • final使变量的值最终。 对于对象(数组是对象),值是对在 memory 中创建的 object 的引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM