3

为什么这段代码有效?

public class Final {
    public final int[][] arr = new int[2][];
    Final(){
        arr[0] = new int[4];
        arr[0] = new int[5];
        arr[1] = new int[4];
        }
    public static void main(String[] args) {
        Final fi = new Final();
        System.out.println(fi.arr[0].length);
        System.out.println(fi.arr[1].length);
    }
}

而以下不起作用我认为这是正确的)。

public class Final {
    public final int[] arr;
    Final(){
        arr = new int[4];
        arr = new int[5];
        }
    public static void main(String[] args) {
        Final fi = new Final();
        System.out.println(fi.arr.length);
    }
}

声明何时final“开始”?

4

4 回答 4

5

final关键字表示变量的值一旦初始化就不会改变。这对原语最有意义,这final int = 5;意味着它不能被重新分配6

对于引用变量,这意味着它不能被重新分配给另一个引用,因为它的值是对一个对象的引用。但这并不能阻止您修改数组的内容。它只是阻止您对引用变量进行另一次赋值。这就是为什么第二段代码不起作用的原因——在它第一次被分配之后,你又给它分配了另一个对象。

于 2013-11-07T21:25:48.447 回答
3

您不是在修改篮子,而是在修改里面的苹果。

从不改变的实例int[][],只是其中的内容。

于 2013-11-07T21:26:16.003 回答
2

arr标记的事实final仅意味着您不能arr引用不同的值。您仍然可以完全自由地修改数组的内容。

所以这意味着这是不允许的:

arr = new int[4];
arr = new int[5]; //Reassigning a final variable that's already initialized- bad!

但这很好:

 arr[0] = new int[4]; 
 arr[0] = new int[5];
 arr[1] = new int[4]; //We haven't changed the array that arr is pointing to
于 2013-11-07T21:25:47.563 回答
2

数组是 Java 中的对象。对象变量实际上是对对象的引用。最终变量或最终字段是初始化后不能指向另一个对象的引用。可以修改引用的对象本身。您必须区分引用和被引用的对象。

于 2013-11-07T21:32:28.057 回答