簡體   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