📜  Java中的final数组 | Final arrays

📅  最后修改于: 2020-03-28 03:33:50             🧑  作者: Mango

预测以下Java程序的输出。

class Test
{
    public static void main(String args[])
    {
       final int arr[] = {1, 2, 3, 4, 5};  // Note: arr is final
       for (int i = 0; i < arr.length; i++)
       {
           arr[i] = arr[i]*10;
           System.out.println(arr[i]);
       }
    }
}

输出:

10
20
30
40
50

数组arr被声明为final,但是array的元素被更改没有任何问题。 在Java中,数组是对象,而对象变量始终是引用。因此,当我们将一个对象变量声明为final时,这意味着该变量不能更改为引用其他任何东西。

// 程序 1
class Test
{
    int p = 20;
    public static void main(String args[])
    {
       final Test t = new Test();
       t.p = 30;
       System.out.println(t.p);
    }
}

输出:30

// 程序 2
class Test
{
    int p = 20;
    public static void main(String args[])
    {
       final Test t1 = new Test();
       Test t2 = new Test();
       t1 = t2;
       System.out.println(t1.p);
    }
}

输出:编译器错误:无法将值分配给最终变量t1
因此,final array意味着实际上是对对象的引用的数组变量不能更改为引用其他任何对象,但是可以修改数组的成员。
作为练习,预测以下程序的输出

class Test
{
    public static void main(String args[])
    {
       final int arr1[] = {1, 2, 3, 4, 5};
       int arr2[] = {10, 20, 30, 40, 50};
       arr2 = arr1;
       arr1 = arr2;
       for (int i = 0; i < arr2.length; i++)
          System.out.println(arr2[i]);
    }
}