[英]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.