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

参照変数の場合、値はオブジェクトへの参照であるため、別の参照に再割り当てできないことを意味します。ただし、配列の内容を変更することはできません。参照変数への別の代入を停止するだけです。これが、コードの 2 番目の部分が機能しない理由です。最初に割り当てられた後に別のオブジェクトを割り当てます。

于 2013-11-07T21:25:48.447 に答える
3

バスケットを変更するのではなく、中のリンゴを変更します。

のインスタンスはint[][]変更されず、その中のコンテンツのみが変更されます。

于 2013-11-07T21:26:16.003 に答える
2

配列は Java のオブジェクトです。オブジェクト変数は、実際にはオブジェクトへの参照です。最終変数または最終フィールドは、初期化後に別のオブジェクトを指すことができない参照です。参照されたオブジェクト自体を変更できます。参照と参照されるオブジェクトを区別する必要があります。

于 2013-11-07T21:32:28.057 に答える
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 に答える