1

空白の final として宣言されている hashMap を変更できるのに、プリミティブ型を変更できないのはなぜですか? たとえば、マップを作成する場合

final Map<String, String> someMap;

コンストラクターで初期化しても、これに値を入れることができます。しかし、プリミティブの場合はそうではありません

final int a;

この場合、 a の値を変更することはできません。誰かがこれを説明できますか?

4

4 に答える 4

3

final一度初期化すると変更できないことを意味します。変数を宣言しているだけで初期化していないため、許可されています。

したがって、これを行うことは有効です

final Map<String, String> someMap;
someMap = new HashMap<String, String>();

ただし、初期化後に別の値を割り当てようとすると、コンパイラは最終変数が既に初期化されているというエラーをスローする必要があります。

    final Map<String, String> someMap;
    someMap = new HashMap<String, String>();
    someMap = new TreeMap<String, String>(); //error here

注:また、ハッシュマップに値を入れたり削除したりしても、最終変数の参照は変更されません。

于 2013-08-29T08:54:35.043 に答える
1

someMap変更できないのは、マップへの参照 (つまり、変数) だけです。マップ自体は変更可能です。たとえば、値を挿入できます。ただし、新しいマップを に割り当てることはできませんsomeMap

于 2013-08-29T08:54:41.790 に答える
1

* emphasized text*あなたが書くとき:

final Map<String, String> someMap;

それが参照であることを理解することが重要でsomeMapあり、参照が最終的であることを宣言しています。実際のオブジェクトは不変ではありませんが、参照は不変です。したがって、参照を変更することはできません。つまり、次のことはできません。

someMap = anotherMap;

後で。

于 2013-08-29T09:14:47.793 に答える